Aynı grafikte ggplot2 kullanarak iki değişkeni çizgi olarak çizme


305

Çok yeni bir soru, ama böyle verilerim olduğunu söyle:

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)
  )

Nasıl hem zaman serilerini çizebilirsiniz var0ve var1aynı grafikte, ile datex-ekseni üzerinde, kullanan ggplot2? Bonus puanlar yaparsanız var0ve var1farklı renkler ve bir efsane içerebilir!

Bunun çok basit olduğuna eminim, ama orada örnek bulamıyorum.

Yanıtlar:


373

Az sayıda değişken için, grafiği kendiniz manuel olarak oluşturabilirsiniz:

ggplot(test_data, aes(date)) + 
  geom_line(aes(y = var0, colour = "var0")) + 
  geom_line(aes(y = var1, colour = "var1"))

3
güzel bir örnek, ancak kendi renklerimi nasıl özelleştirebilirim (örn. siyah ve turuncu)? çünkü colour=değişken adı olarak kullandığınız anlaşılıyor .
Darwin PC

1
colour='var_names'hadley tarafından belirtildiği gibi bile iyi çalışıyor. ancak @DaveX - işlev tarafından otomatik olarak seçilen renkler yerine belirli renkler seçmek isterse daha spesifik olur.
I_m_LeMarque

Nasıl efsane ekleyebilirim?
user1700890

361

Genel yaklaşım uzun biçimi (kullanarak veri dönüştürülmesidir melt()paketten reshapeveya reshape2) ya da gather()/ pivot_longer()gelen tidyrpaket:

library("reshape2")
library("ggplot2")

test_data_long <- melt(test_data, id="date")  # convert to long format

ggplot(data=test_data_long,
       aes(x=date, y=value, colour=variable)) +
       geom_line()

ggplot2 çıkışı

Ayrıca , verileri baştan sona yeniden şekillendirmek için bu soruya bakın .


8
Verileri eritmek için paketin gather()işlevini de kullanabilirsiniz tidyr:gather(test_data, variable, value, -date)
janoserkezyi

33

Verilerin ggplot2 için "geniş" yerine "uzun" biçiminde olması gerekir. "geniş", her değişkenin farklı bir sütun olarak (şimdi sahip olduğunuz gibi) her satırda bir gözlem olması anlamına gelir. Bunu, değişkenin adını söyleyen bir sütunun ve değişkenin değerini söyleyen başka bir sütunun olduğu "uzun" biçime dönüştürmeniz gerekir. Genişten yükseğe doğru geçme işlemine genellikle "erime" denir. tidyr::gatherVeri çerçevenizi eritmek için kullanabilirsiniz :

library(ggplot2)
library(tidyr)

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)
  )
test_data %>%
    gather(key,value, var0, var1) %>%
    ggplot(aes(x=date, y=value, colour=key)) +
    geom_line()

çoklu seri ggplot2

Sadece boru ile yaptıktan sonra tüketilen dataşeyin şöyle görünür:ggplotgather

date        key     value
2002-01-01  var0    100.00000
2002-02-01  var0    115.16388 
...
2007-11-01  var1    114.86302
2007-12-01  var1    119.30996

13

Verilerinizi kullanma:

test_data <- data.frame(
var0 = 100 + c(0, cumsum(runif(49, -20, 20))),
var1 = 150 + c(0, cumsum(runif(49, -10, 10))),
Dates = seq.Date(as.Date("2002-01-01"), by="1 month", length.out=100))

Ne ggplot()ile çalışmak istiyorum yığılmış bir sürüm oluşturmak :

stacked <- with(test_data,
                data.frame(value = c(var0, var1),
                           variable = factor(rep(c("Var0","Var1"),
                                                 each = NROW(test_data))),
                           Dates = rep(Dates, 2)))

Bu durumda üretim içinde stackedoldukça kolay sadece manipülasyonlara bir çift yapmak zorunda olduğu, ama reshape()ve reshapeve reshape2sizi manipüle etmek daha karmaşık gerçek veri seti varsa faydalı olabilir.

Veriler bu yığılmış formda olduktan sonra, ggplot()tüm ekstralar ile istediğiniz çizimi üretmek için basit bir çağrı gerektirir (daha yüksek seviyeli çizim paketlerinin böyle latticeve ggplot2kullanışlı olmasının bir nedeni ):

require(ggplot2)
p <- ggplot(stacked, aes(Dates, value, colour = variable))
p + geom_line()

Eksen etiketlerini, efsane başlığını vb.

HTH


1
Sanırım kodunuzda yanlış yerleştirilmiş bir parensiniz var. Ben sonra ne olduğunu düşünüyorum: yığılmış <- ile (test_data, data.frame (değer = c (var0, var1), değişken = faktör (rep (c ("Var0", "Var1"))), her = NROW (test_verisi), Tarihler = tekrar (tarih, 2))). Ayrıca, "her" sütununun amacı nedir? Ve bu sadece rcs tarafından gösterildiği gibi verileri eritmenin daha karmaşık ve daha az verimli bir yolu değil mi? Sanırım erimişin işi yapamayacağı bir örnek hayal edebiliyorum, ama bir şey eksik olmadıkça neredeyse bu iş için doğru araç bu mu?
Chase

1
@chase, üzgünüm, bu Emacs ESS girintiyi yanlış yapıyor. her biri bir argüman rep(), bu yüzden gerçekten sadece 3 sütun alıyoruz stacked. Girintiyi daha net hale getirmek için kodu düzenleyeceğim.
Gavin Simpson

1
@kovalamak; hakkındaki yorumunuz melt()iyi alınmıştır ve yeniden şekillendirme [2] paketinin burada yararlı olacağını unutmayın. Reshape2'ye aşina değilim ve elle yapmak gibi basit bir manipülasyon için bir çağrıdan daha karmaşıktır melt(), nasıl kullanılacağını okumam gerekmediği için daha az çaba harcadım melt(). Ve ben kendiminkini üretirken cevapları gizlice içeriye soktu; cevabı başlattığımda hiç cevap yoktu. bir kediyi cildin birden fazla yolu - dedikleri gibi! ;-)
Gavin Simpson

7

Ben de R için yeniyim ama ggplot'un nasıl çalıştığını anlamaya çalışırken, bunu yapmanın başka bir yolunu bulduğumu düşünüyorum. Sadece tam olarak mükemmel bir çözüm olarak değil, farklı bakış açıları eklemek için paylaşıyorum.

Ggplot veri çerçeveleri ile daha iyi çalışmak için yapıldığını biliyorum ama belki de bazen bir veri çerçevesi kullanmadan doğrudan iki vektör çizebilirsiniz bilmek bazen yararlı olabilir.

Veri yükleniyor. Orijinal tarih vektörü uzunluğu 100 iken var0 ve var1'in uzunluğu 50'dir, bu yüzden sadece mevcut verileri çizerim (ilk 50 tarih).

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=50)    

plotlama

ggplot() + geom_line(aes(x=date,y=var0),color='red') + 
           geom_line(aes(x=date,y=var1),color='blue') + 
           ylab('Values')+xlab('date')

resim açıklamasını buraya girin

Ancak bu biçimi kullanarak doğru bir açıklama ekleyemedim. Nasıl olduğunu bilen var mı?


1
Bu bir efsane ekler 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')
flurbius
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.