Uma pergunta muito recente, mas digamos que eu tenha dados como este:
test_data <-
data.frame(
var0 = 100 + c(0, cumsum(runif(49, -20, 20))),
var1 = 150 + c(0, cumsum(runif(49, -10, 10))),
date = seq(as.Date("2002-01-01"), by="1 month", length.out=100)
)
Como plotar ambas as séries temporais var0
e var1
no mesmo gráfico, com date
o eixo x, usando ggplot2
? Os pontos de bónus se você fizer var0
e var1
cores diferentes, e pode incluir uma lenda!
Tenho certeza de que isso é muito simples, mas não consigo encontrar exemplos por aí.
colour=
como o nome da variável.colour='var_names'
conforme especificado por hadley funciona bem. mas @DaveX - seria mais específico se você quiser escolher cores específicas em vez de cores selecionadas automaticamente pela função.A abordagem geral é converter os dados em formato longo (usando
melt()
do pacotereshape
oureshape2
) ougather()
/pivot_longer()
dotidyr
pacote:Veja também esta pergunta sobre como remodelar dados de amplos para longos.
fonte
gather()
função detidyr
pacote para derreter os dados:gather(test_data, variable, value, -date)
Você precisa que os dados estejam no formato "alto" em vez de "amplo" para o ggplot2. "wide" significa ter uma observação por linha com cada variável como uma coluna diferente (como você tem agora). Você precisa convertê-lo para um formato "alto", onde você tem uma coluna que informa o nome da variável e outra coluna que informa o valor da variável. O processo de passagem da largura para a altura é geralmente chamado de "fusão". Você pode usar
tidyr::gather
para derreter seu quadro de dados:Só para esclarecer o
data
queggplot
está consumindo após a tubulação,gather
fica assim:fonte
Usando seus dados:
Eu crio uma versão empilhada com a qual
ggplot()
gostaria de trabalhar:Neste caso, a produção
stacked
era muito fácil, já que só tinha que fazer um par de manipulações, masreshape()
eareshape
ereshape2
pode ser útil se você tiver um conjunto de dados reais mais complexo para manipular.Uma vez que os dados estão neste formulário empilhado, é necessária apenas uma
ggplot()
chamada simples para produzir o gráfico desejado com todos os extras (uma razão pela qual os pacotes de plotagem de nível superior gostamlattice
eggplot2
são tão úteis):Vou deixar você arrumar os rótulos dos eixos, o título da legenda etc.
HTH
fonte
rep()
, então realmente estamos apenas recebendo 3 colsstacked
. Vou editar o código para tornar o recuo mais claro.melt()
é bem aceito e observo que o pacote remodelar [2] seria útil aqui. Eu não estou tão familiarizado com o remodelar2 e, para uma manipulação tão simples fazê-lo manualmente, é mais complexo do que uma ligaçãomelt()
, foi menos esforço, pois eu não precisava ler como usarmelt()
. E rcs esgueirou-se com sua resposta enquanto eu produzia a minha; quando iniciei a resposta, não havia respostas. mais de uma maneira de esfolar um gato - como eles dizem! ;-)Também sou novo no R, mas, tentando entender como o ggplot funciona, acho que tenho outra maneira de fazê-lo. Apenas compartilho provavelmente não como uma solução perfeita e completa, mas para adicionar alguns pontos de vista diferentes.
Eu sei que o ggplot foi criado para funcionar melhor com quadros de dados, mas talvez às vezes também seja útil saber que você pode plotar diretamente dois vetores sem usar um quadro de dados.
Carregando dados. O comprimento do vetor de data original é 100, enquanto var0 e var1 têm comprimento 50, portanto, planto apenas os dados disponíveis (primeiras 50 datas).
Plotagem
No entanto, não consegui adicionar uma legenda correta usando este formato. Alguém sabe como?
fonte
ggplot() + geom_line(aes(x=date,y=var0, group=1, colour = 'red')) + geom_line(aes(x=date,y=var1, group = 2, colour = 'blue')) + ylab('Values')+xlab('date')