लीजेंड को ggplot2 लाइन प्लॉट में जोड़ें


143

मेरे पास ggplot2 में किंवदंतियों के बारे में एक प्रश्न है। मैं एक ही ग्राफ में तीन पंक्तियों को प्लॉट करने में कामयाब रहा और इस्तेमाल किए गए तीन रंगों के साथ एक किंवदंती जोड़ना चाहता हूं। यह प्रयुक्त कोड है

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

और आउटपुट

ggplot तीन लाइनें

मैं इस्तेमाल किए गए तीन रंगों और चर (TempMax, TempMedia और TempMedia) के नाम के साथ एक किंवदंती जोड़ना चाहता हूं। मैंने कोशिश की है

scale_colour_manual

लेकिन सटीक तरीका नहीं मिल सकता है।

दुर्भाग्य से मूल डेटा को लिंक की गई साइट से हटा दिया गया था और उसे पुनर्प्राप्त नहीं किया जा सका। लेकिन वे इस प्रारूप के साथ मौसम डेटा फ़ाइलों से आए थे

"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

मैं अभी भी उत्सुक हूं कि विदर किंवदंतियों को भूखंड के अलग-अलग तत्वों (जैसे कि अलग-अलग geom_line) से जोड़ा जा सकता है।
एटिएन लो-डेकेरी

यदि आपके पास केवल 3 लाइनें हैं, तो मैं आपको dirrectlabels पैकेज को देखने का सुझाव दूंगा। (लिंक)
टायलर रिंकर

@TylerRinker मैंने इसे पहले अन्य प्रयोजनों के लिए इस्तेमाल किया था, लेकिन अब सीएसगिलिस्पी का उत्तर मेरे लिए बेहतर काम करता है
पैक्सोमेट

@ EtienneLow-Décarie आप कर सकते हैं, लेकिन सामान्य तौर पर केवल अगर वे विभिन्न सौंदर्यशास्त्र का उपयोग करते हैं। उदाहरण के लिए लाइनों के एक सेट को कलर करने के लिए और दूसरा लिनेटाइप को मैप करने के लिए। आमतौर पर आप प्रत्येक जियोम के साथ-साथ उस स्थिति में भी अलग-अलग डेटा पास करेंगे।
Joran

जवाबों:


82

मुझे लगता है कि अगर मैं कई geom में अलग-अलग रंगों को निर्दिष्ट कर रहा हूं, तो मैं इसे गलत कर रहा हूं। यहां बताया गया है कि मैं आपका डेटा कैसे तैयार करूंगा:

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

यह सब छोड़ दिया एक सरल ggplot कमांड है:

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

उदाहरण कथानक

यहां छवि विवरण दर्ज करें


87
मैं अभी भी उत्सुक हूं कि विभिन्न तत्वों जैसे कि geom_line, के साथ जुड़े किंवदंतियों को कैसे जोड़ा जाए, जो कि मैं हालांकि प्रश्न का मूल उद्देश्य था।
एटिने लो-डेकेरी

202

चूँकि @ एटीन ने यह पूछा कि डेटा को पिघलाए बिना यह कैसे किया जाए (जो सामान्य रूप से पसंदीदा तरीका है, लेकिन मैं मानता हूं कि कुछ मामले हो सकते हैं जहां यह संभव नहीं है), मैं निम्नलिखित विकल्प प्रस्तुत करता हूं।

मूल डेटा के सबसेट से प्रारंभ करें:

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

आप वांछित प्रभाव प्राप्त कर सकते हैं (और यह मूल प्लॉटिंग कोड को भी साफ करता है):

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

विचार यह है कि प्रत्येक पंक्ति को colourसौंदर्य को निरंतर स्ट्रिंग से मैप करके एक रंग दिया जाता है । स्ट्रिंग का चयन करना जो आप किंवदंती में दिखाना चाहते हैं वह सबसे आसान है। तथ्य यह है कि इस मामले में यह वैसा ही है जैसा कि yचर का नाम प्लॉट किया जा रहा है, महत्वपूर्ण नहीं है; यह तार का कोई भी सेट हो सकता है। यह बहुत महत्वपूर्ण है कि यह aesकॉल के अंदर है ; आप इस "चर" के लिए एक मानचित्रण बना रहे हैं।

scale_colour_manualअब इन तारों को उपयुक्त रंगों में मैप कर सकते हैं। परिणाम है यहां छवि विवरण दर्ज करें

कुछ मामलों में, स्तरों और रंगों के बीच की मैपिंग को मैन्युअल स्केल में मानों को नामांकित करके स्पष्ट किया जाना चाहिए ( यह इंगित करने के लिए @DaveRGP के लिए धन्यवाद ):

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

(पहले जैसा ही आंकड़ा देते हुए)। नामित मूल्यों के साथ, ब्रेक का उपयोग किंवदंती में आदेश सेट करने के लिए किया जा सकता है और मूल्यों में किसी भी क्रम का उपयोग किया जा सकता है।

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
मैं इस समाधान से प्यार करता हूं, लेकिन मुझे लगता है कि एक सीमा हो सकती है। क्या 'ब्रेक' और 'वैल्यू' वेरिएबल्स की मैपिंग के बीच एक अल्फाबेटिक सॉर्टिंग इश्यू है? TempM {a] x, TempM {e} dia और TempM {i} n बड़े करीने से, हालांकि जब मैं इसे अपने चर नामों के अनुसार ढालता हूं, तो रंग वर्णानुक्रमिक क्रम से 'ब्रेक' से मेल खाते प्रतीत होते हैं, ऑर्डर इनपुट में नहीं। । क्या इसको दर्शाने / ठीक करने के लिए उपरोक्त को स्पष्ट / परिष्कृत किया जा सकता है?
डेवआरजीपी

3
मैंने उस मुद्दे को ठीक करने में कामयाबी पाई है जिसे मैंने पहले खरीदा था: रंग ऑर्डरिंग। उस प्रपत्र का उपयोग करें scale_colour_manual("", values = c("TempMax" = "red", "TempMedia" = "green", "TempMin" = "blue"))जहां TempMax, TempMedia और TempMin को रंग तर्क के रूप में ऊपर दिए गए उत्तर में निर्दिष्ट किया गया है।
डेवआरजीपी

@DaveRGP क्या इसे ggplot का बग माना जा सकता है?
एलेसांद्रो जैकपसन

1
@StellaBiderman धन्यवाद। यह जानना अच्छा है कि यह उत्तर अभी भी (लगभग) 5 साल (!) बाद में उपयोगी है।
ब्रायन डिग्स

1
@BrianDiggs आपको यह पता नहीं होगा कि इस रेखा के विपरीत इस शो को एक पैमाने पर कैसे बनाया जा सकता है?
स्टेला बिडरमैन

2

मुझे वास्तव में @Brian Diggs द्वारा प्रस्तावित समाधान पसंद है। हालांकि, मेरे मामले में, मैं उन्हें स्पष्ट रूप से देने के बजाय एक लूप में लाइन प्लॉट बनाता हूं क्योंकि मुझे एप्रीओरी नहीं पता है कि मेरे पास कितने प्लॉट होंगे। जब मैंने @ ब्रायन के कोड को अनुकूलित करने की कोशिश की तो मुझे रंगों को सही ढंग से संभालने के साथ कुछ समस्याओं का सामना करना पड़ा। मैं सौंदर्य कार्यों को संशोधित करने की जरूरत है बाहर कर दिया। यदि किसी के पास एक ही समस्या है, तो यहां वह कोड है जो मेरे लिए काम करता है।

मैंने @Brian के समान डेटा फ़्रेम का उपयोग किया:

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

मेरे मामले में, मैं उत्पन्न करता हूं my.colsऔर my.namesगतिशील रूप से, लेकिन मैं चीजों को अनावश्यक रूप से जटिल नहीं बनाना चाहता हूं इसलिए मैं उन्हें यहां स्पष्ट रूप से देता हूं। ये तीन पंक्तियाँ किंवदंती के आदेश और रंगों को असाइन करना आसान बनाती हैं।

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

और यहाँ साजिश है:

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

यहां छवि विवरण दर्ज करें


2
इस जटिलता पर, यह वास्तव में बहुत आसान हो जाता है कि आपके डेटा को लंबे समय के रूप में फिर से आकार दें ggplot
ऐक्समैन

1
मुझे नहीं लगता कि यह वास्तव में @Brian द्वारा पोस्ट किए गए मूल उत्तर की तुलना में जटिलता जोड़ता है। इसके अलावा, कुछ लोग डेटा को फिर से खोले बिना ऐसा करना चाह सकते हैं।
Justyna

... और यह दृष्टिकोण अलग-अलग जियोम्स (प्लॉट प्रकार) को वैरिएबल
मैक
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.