Ggplot2 çizgi grafiğine açıklama ekle


143

Ggplot2'deki efsaneler hakkında bir sorum var. Aynı grafiğe üç çizgi çizmeyi başardım ve kullanılan üç renkle bir efsane eklemek istiyorum. Kullanılan kod bu

library(ggplot2)    
require(RCurl)

link<-getURL("https://dl.dropbox.com/s/ds5zp9jonznpuwb/dat.txt")
datos<- read.csv(textConnection(link),header=TRUE,sep=";")
datos$fecha <- as.POSIXct(datos[,1], format="%d/%m/%Y")    

temp = ggplot(data=datos,aes(x=fecha, y=TempMax,colour="1")) + 
           geom_line(colour="red") + opts(title="TITULO") +
           ylab("Temperatura (C)") + xlab(" ") + 
           scale_y_continuous(limits = c(-10,40)) + 
           geom_line(aes(x=fecha, y=TempMedia,colour="2"),colour="green") + 
           geom_line(aes(x=fecha, y=TempMin,colour="2"),colour="blue") +
           scale_colour_manual(values=c("red","green","blue"))

temp

ve çıktı

ggplot üç satır

Kullanılan üç renk ve değişkenin adı (TempMax, TempMedia ve TempMin) ile bir efsane eklemek istiyorum. denedim

scale_colour_manual

ama kesin yolu bulamıyorum.

Maalesef orijinal veriler bağlantılı siteden silindi ve kurtarılamadı. Ama bu formatta meteo veri dosyalarından geldiler

"date","Tmax","Tmin","Tmed","Precip.diaria","Wmax","Wmed"
2000-07-31 00:00:00,-1.7,-1.7,-1.7,-99.9,20.4,20.4
2000-08-01 00:00:00,22.9,19,21.11,-99.9,6.3,2.83
2000-08-03 00:00:00,24.8,12.3,19.23,-99.9,6.8,3.87
2000-08-04 00:00:00,20.3,9.4,14.4,-99.9,8.3,5.29
2000-08-08 00:00:00,25.7,14.4,19.5,-99.9,7.9,3.22
2000-08-09 00:00:00,29.8,16.2,22.14,-99.9,8.5,3.27
2000-08-10 00:00:00,30,17.8,23.5,-99.9,7.7,3.61
2000-08-11 00:00:00,27.5,17,22.68,-99.9,8.8,3.85
2000-08-12 00:00:00,24,13.3,17.32,-99.9,8.4,3.49

Efsanelerin arsanın ayrı öğelerine (farklı geom_line gibi) bağlanıp bağlanamayacağını merak ediyorum.
Etienne Low-Décarie

Sadece 3 satırınız varsa, dirrectlabels paketine bakmanızı öneririm. (LINK)
Tyler Rinker

@TylerRinker Daha önce başka amaçlarla kullanmıştım ama şimdi csgillespie'nin cevabı benim için daha iyi çalışıyor
pacomet

@ EtienneLow-Décarie Yapabilirsiniz, ancak genel olarak sadece farklı estetik kullanıyorlarsa. örn. bir çizgi kümesini renkle, diğerini çizgi türüyle eşleme. Genellikle bu durumda her bir jeome ayrı veri aktarırsınız.
joran

Yanıtlar:


82

Birden fazla geom'de ayrı renkler belirtirsem, yanlış yaptığımı fark etme eğilimindeyim. Verilerinizi nasıl çizeceğim:

##Subset the necessary columns
dd_sub = datos[,c(20, 2,3,5)]
##Then rearrange your data frame
library(reshape2)
dd = melt(dd_sub, id=c("fecha"))

Geriye kalan tek şey basit bir ggplot komutudur:

ggplot(dd) + geom_line(aes(x=fecha, y=value, colour=variable)) +
  scale_colour_manual(values=c("red","green","blue"))

Örnek grafik

resim açıklamasını buraya girin


87
Hala sorunun asıl amacı olan geom_line gibi öğelerin ayrı eklenmesi ile ilişkili efsanelerin nasıl ekleneceğini merak ediyorum.
Etienne Low-Décarie

202

Yana @Etienne verilerin nasıl erimeden yapmak istenir (genel olarak tercih edilen bir yöntemdir, ancak bu mümkün olmadığı durumlarda, bazı durumlar olabilir tanımak), aşağıdaki alternatif sunmaktadır.

Orijinal verilerin bir alt kümesiyle başlayın:

datos <-
structure(list(fecha = structure(c(1317452400, 1317538800, 1317625200, 
1317711600, 1317798000, 1317884400, 1317970800, 1318057200, 1318143600, 
1318230000, 1318316400, 1318402800, 1318489200, 1318575600, 1318662000, 
1318748400, 1318834800, 1318921200, 1319007600, 1319094000), class = c("POSIXct", 
"POSIXt"), tzone = ""), TempMax = c(26.58, 27.78, 27.9, 27.44, 
30.9, 30.44, 27.57, 25.71, 25.98, 26.84, 33.58, 30.7, 31.3, 27.18, 
26.58, 26.18, 25.19, 24.19, 27.65, 23.92), TempMedia = c(22.88, 
22.87, 22.41, 21.63, 22.43, 22.29, 21.89, 20.52, 19.71, 20.73, 
23.51, 23.13, 22.95, 21.95, 21.91, 20.72, 20.45, 19.42, 19.97, 
19.61), TempMin = c(19.34, 19.14, 18.34, 17.49, 16.75, 16.75, 
16.88, 16.82, 14.82, 16.01, 16.88, 17.55, 16.75, 17.22, 19.01, 
16.95, 17.55, 15.21, 14.22, 16.42)), .Names = c("fecha", "TempMax", 
"TempMedia", "TempMin"), row.names = c(NA, 20L), class = "data.frame")

İstediğiniz efekti elde edebilirsiniz (ve bu da orijinal çizim kodunu temizler):

ggplot(data = datos, aes(x = fecha)) +
  geom_line(aes(y = TempMax, colour = "TempMax")) +
  geom_line(aes(y = TempMedia, colour = "TempMedia")) +
  geom_line(aes(y = TempMin, colour = "TempMin")) +
  scale_colour_manual("", 
                      breaks = c("TempMax", "TempMedia", "TempMin"),
                      values = c("red", "green", "blue")) +
  xlab(" ") +
  scale_y_continuous("Temperatura (C)", limits = c(-10,40)) + 
  labs(title="TITULO")

Fikir, her çizgiye colourestetiği sabit bir dizeyle eşleyerek bir renk verilmesi . Göstergede görünmesini istediğiniz dizeyi seçmek en kolayıdır. Bu durumda y, çizilen değişkenin adıyla aynı olması önemli değildir; herhangi bir dizi olabilir. Bunun aesçağrının içinde olması çok önemlidir ; bu "değişken" ile eşleme oluşturuyorsunuz.

scale_colour_manualartık bu dizeleri uygun renklerle eşleyebilir. Sonuç resim açıklamasını buraya girin

Bazı durumlarda, seviyeler ve renkler arasındaki eşlemenin manuel ölçekte değerler adlandırılarak açık hale getirilmesi gerekir (bunu belirtmek için @DaveRGP'ye teşekkürler ):

ggplot(data = datos, aes(x = fecha)) +
  geom_line(aes(y = TempMax, colour = "TempMax")) +
  geom_line(aes(y = TempMedia, colour = "TempMedia")) +
  geom_line(aes(y = TempMin, colour = "TempMin")) +
  scale_colour_manual("", 
                      values = c("TempMedia"="green", "TempMax"="red", 
                                 "TempMin"="blue")) +
  xlab(" ") +
  scale_y_continuous("Temperatura (C)", limits = c(-10,40)) + 
  labs(title="TITULO")

(öncekiyle aynı rakamı verir). Adlandırılmış değerlerde, sonlar göstergedeki sırayı ayarlamak için kullanılabilir ve değerlerde herhangi bir sıra kullanılabilir.

ggplot(data = datos, aes(x = fecha)) +
  geom_line(aes(y = TempMax, colour = "TempMax")) +
  geom_line(aes(y = TempMedia, colour = "TempMedia")) +
  geom_line(aes(y = TempMin, colour = "TempMin")) +
  scale_colour_manual("", 
                      breaks = c("TempMedia", "TempMax", "TempMin"),
                      values = c("TempMedia"="green", "TempMax"="red", 
                                 "TempMin"="blue")) +
  xlab(" ") +
  scale_y_continuous("Temperatura (C)", limits = c(-10,40)) + 
  labs(title="TITULO")


2
Bu çözümü seviyorum, ama bence bir sınırlama olabilir. 'Kesmeler' ve 'değerler' değişkenlerinin eşlenmesi arasında alfabetik bir sıralama sorunu var mı? TempM {a] x, TempM {e} dia ve TempM {i} n düzgün bir şekilde sıralanıyor, ancak bunu değişken adlarıma uyarladığımda renkler, sipariş girişinde değil, 'sonlara' alfabetik sırayla eşleştiriliyor gibi görünüyor . Yukarıdakiler bunu yansıtmak / düzeltmek için netleştirilebilir / rafine edilebilir mi?
DaveRGP

3
Daha önce satın aldığım soruna bir çözüm bulmayı başardım: renk siparişi. scale_colour_manual("", values = c("TempMax" = "red", "TempMedia" = "green", "TempMin" = "blue"))yukarıdaki cevaptaki gibi renk bağımsız değişkeni olarak TempMax, TempMedia ve TempMin belirtildiği formu kullanın .
DaveRGP

@DaveRGP Bir ggplot hatası olarak kabul edilebilir mi?
Alessandro Jacopson

1
@StellaBiderman Teşekkürler. Bu cevabın (neredeyse) 5 yıl (!) Sonra hala yararlı olduğunu bilmek güzel.
Brian Diggs

1
@BrianDiggs Bu şovun bir çizginin aksine ölçeğinde nasıl bir nokta yapacağını bilemezdiniz, değil mi?
Stella Biderman

2

@Brian Diggs tarafından önerilen çözümü gerçekten çok seviyorum. Ancak, benim durumumda, çizgi çizimlerini açık bir şekilde vermek yerine bir döngüde oluşturuyorum çünkü apriori'ye kaç tane arazim olacağını bilmiyorum. @ Brian'ın kodunu uyarlamaya çalıştığımda renkleri doğru şekilde kullanmayla ilgili bazı sorunlarla karşılaştım. Anlaşıldı ki estetik işlevleri değiştirmem gerekiyordu. Birisi aynı sorunu yaşıyorsa, işte benim için çalışan kod.

@Brian ile aynı veri çerçevesini kullandım:

data <- structure(list(month = structure(c(1317452400, 1317538800, 1317625200, 1317711600, 
                                       1317798000, 1317884400, 1317970800, 1318057200, 
                                       1318143600, 1318230000, 1318316400, 1318402800, 
                                       1318489200, 1318575600, 1318662000, 1318748400, 
                                       1318834800, 1318921200, 1319007600, 1319094000), 
                                     class = c("POSIXct", "POSIXt"), tzone = ""),
                   TempMax = c(26.58, 27.78, 27.9, 27.44, 30.9, 30.44, 27.57, 25.71, 
                               25.98, 26.84, 33.58, 30.7, 31.3, 27.18, 26.58, 26.18, 
                               25.19, 24.19, 27.65, 23.92), 
                   TempMed = c(22.88, 22.87, 22.41, 21.63, 22.43, 22.29, 21.89, 20.52,
                                 19.71, 20.73, 23.51, 23.13, 22.95, 21.95, 21.91, 20.72, 
                                 20.45, 19.42, 19.97, 19.61), 
                   TempMin = c(19.34, 19.14, 18.34, 17.49, 16.75, 16.75, 16.88, 16.82, 
                               14.82, 16.01, 16.88, 17.55, 16.75, 17.22, 19.01, 16.95, 
                               17.55, 15.21, 14.22, 16.42)), 
              .Names = c("month", "TempMax", "TempMed", "TempMin"), 
              row.names = c(NA, 20L), class = "data.frame")  

Benim durumumda, dinamik olarak üretiyorum my.colsve bir my.namesşeyleri gereksiz yere karmaşık hale getirmek istemiyorum, bu yüzden onları burada açıkça veriyorum. Bu üç çizgi, göstergenin sırasını ve renkleri atamayı kolaylaştırır.

my.cols <- heat.colors(3, alpha=1)
my.names <- c("TempMin", "TempMed", "TempMax")
names(my.cols) <- my.names

Ve işte konu:

p <-  ggplot(data, aes(x = month))

for (i in 1:3){
  p <- p + geom_line(aes_(y = as.name(names(data[i+1])), colour = 
colnames(data[i+1])))#as.character(my.names[i])))
}
p + scale_colour_manual("", 
                        breaks = as.character(my.names),
                        values = my.cols)
p

resim açıklamasını buraya girin


2
Bu karmaşıklıkta, verilerinizi beklenen uzun forma dönüştürmek gerçekten çok daha kolay hale geliyor ggplot.
Axeman

1
@Brian tarafından yayınlanan orijinal cevap karşılaştırmak gerçekten karmaşıklık eklediğini sanmıyorum. Ayrıca, bazı insanlar verileri yeniden şekillendirmeden yapmak isteyebilir.
Justyna

... ve bu yaklaşım değişkene göre farklı jeomlara (arsa türleri) izin verir
mac
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.