एक ही ग्राफ पर ggplot2 का उपयोग करते हुए लाइनों के रूप में दो चर को प्लॉट करना


305

एक बहुत ही नया सवाल, लेकिन कहते हैं कि मेरे पास इस तरह का डेटा है:

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

मैं एक्स-अक्ष पर, उपयोग करके दोनों समय श्रृंखला var0और var1एक ही ग्राफ पर कैसे साजिश कर सकता हूं ? बोनस अंक यदि आप बनाते हैं और विभिन्न रंग, और एक किंवदंती शामिल कर सकते हैं!dateggplot2var0var1

मुझे यकीन है कि यह बहुत सरल है, लेकिन मुझे कोई उदाहरण नहीं मिल रहा है।

जवाबों:


373

छोटी संख्या में चर के लिए, आप स्वयं प्लॉट का निर्माण कर सकते हैं:

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

3
अच्छा उदाहरण है, लेकिन अपने खुद के रंगों (जैसे काले और नारंगी) को कैसे अनुकूलित किया जाए ?, क्योंकि ऐसा लगता है कि आप colour=चर नाम के रूप में उपयोग कर रहे हैं ।
डार्विन पीसी

1
colour='var_names'हेली द्वारा निर्दिष्ट के रूप में भी ठीक काम करता है। लेकिन @DaveX - अधिक विशिष्ट होगा यदि कोई फ़ंक्शन द्वारा स्वचालित रूप से चयनित रंगों के बजाय विशिष्ट रंगों का चयन करना चाहता है।
I_m_LeMarque

मैं इसमें एक किंवदंती कैसे जोड़ सकता हूं?
user1700890

361

सामान्य दृष्टिकोण लंबे प्रारूप (उपयोग करने के लिए डेटा परिवर्तित करने के लिए है melt()पैकेज से reshapeया reshape2) या gather()/ pivot_longer()से tidyrपैकेज:

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 आउटपुट

इस सवाल को विस्तृत से लंबी अवधि के डेटा को फिर से देखने पर भी देखें ।


8
आप डेटा को पिघलाने के लिए पैकेज के gather()कार्य का भी उपयोग कर सकते हैं tidyr:gather(test_data, variable, value, -date)
Janosdivenyi

33

आपको ggplot2 के लिए "विस्तृत" के बजाय "लंबा" प्रारूप में होने की आवश्यकता है। "वाइड" का अर्थ है कि प्रत्येक चर के साथ एक पंक्ति में एक अलग कॉलम (जैसे आपके पास अब) है। आपको इसे "लंबा" प्रारूप में बदलने की आवश्यकता है जहां आपके पास एक स्तंभ है जो आपको चर का नाम बताता है और एक अन्य स्तंभ जो आपको चर का मूल्य बताता है। चौड़ी से लंबी तक गुजरने की प्रक्रिया को आमतौर पर "पिघलने" कहा जाता है। आप tidyr::gatherअपने डेटा फ़्रेम को पिघलाने के लिए उपयोग कर सकते हैं :

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

कई श्रृंखला ggplot2

बस यह स्पष्ट होना चाहिए dataकि ggplotइसके माध्यम से पाइपिंग के बाद खपत हो रही है gather:

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

अपने डेटा का उपयोग करना:

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

मैं एक स्टैक्ड संस्करण बनाता हूं जो वह है जिसके ggplot()साथ काम करना चाहते हैं:

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

इस मामले में उत्पादन stackedकाफी आसान के रूप में हम केवल जोड़तोड़ की एक जोड़ी करना था लेकिन था, reshape()और reshapeऔर reshape2आप में हेरफेर करने के एक अधिक जटिल वास्तविक डेटा सेट करता है, तो उपयोगी हो सकता है।

एक बार जब डेटा इस स्टैक्ड रूप में होता है, तो आपको केवल ggplot()सभी एक्स्ट्रा (एक कारण जो उच्च-स्तरीय प्लॉटिंग पैकेज पसंद करते हैं latticeऔर ggplot2इतने उपयोगी होते हैं) के साथ वांछित प्लॉट का उत्पादन करने के लिए एक सरल कॉल की आवश्यकता होती है :

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

अक्ष लेबल, किंवदंती शीर्षक आदि को साफ करने के लिए मैं इसे आपके पास छोड़ दूँगा।

HTH


1
मुझे लगता है कि आप अपने कोड में एक गलत जगह पर हैं। मुझे लगता है कि यह आपके बाद है: स्टैक्ड <- (test_data, data.frame (value = c (var0, var1)), वेरिएबल = फ़ैक्टर (rep (c (Var0 "," Var1 "))), प्रत्येक = NROW (test_data), दिनांक = प्रतिनिधि (दिनांक, 2)))। इसके अलावा, कॉलम "प्रत्येक" का उद्देश्य क्या है? और क्या यह डेटा को पिघलाने के लिए एक अधिक दृढ़ और कम कुशल तरीका नहीं है जैसा कि rcs द्वारा दिखाया गया है? मुझे लगता है कि मैं एक ऐसे उदाहरण की कल्पना कर सकता हूं जहां पिघलकर काम पूरा नहीं होगा, लेकिन जब तक मैं कुछ याद नहीं कर रहा हूँ, यह लगभग निश्चित रूप से इस काम का सही उपकरण है?
चेस

1
@चेज़, सॉरी, यही Emacs ESS इंडेंटिंग गलत है। प्रत्येक के लिए एक तर्क है rep(), इसलिए हम वास्तव में केवल 3 कोल्स प्राप्त कर रहे हैं stacked। इंडेंट को स्पष्ट करने के लिए मैं कोड संपादित करूँगा।
गेविन सिम्पसन

1
@chase; आपकी टिप्पणी के बारे melt()में अच्छी तरह से लिया गया है, और मैं ध्यान देता हूं कि यहाँ पर reshape [2] पैकेज उपयोगी होगा। मैं reshape2 से परिचित नहीं हूँ और इस तरह के एक सरल हेरफेर के लिए इसे हाथ से करना एक कॉल की तुलना में अधिक जटिल है melt(), यह कम प्रयास था क्योंकि मुझे पढ़ने की आवश्यकता नहीं थी कि कैसे उपयोग करें melt()। और मेरे जवाब के साथ छींक दिया जब मैं मेरा उत्पादन कर रहा था; जब मैंने जवाब शुरू किया तो कोई जवाब नहीं था। एक बिल्ली की त्वचा के लिए एक से अधिक तरीके से - जैसा कि वे कहते हैं! ;-)
गेविन सिम्पसन

7

मैं आर के लिए भी नया हूं लेकिन यह समझने की कोशिश कर रहा हूं कि कैसे ggplot काम करता है मुझे लगता है कि मुझे इसे करने का एक और तरीका मिलता है। मैं सिर्फ एक संपूर्ण संपूर्ण समाधान के रूप में नहीं बल्कि कुछ अलग दृष्टिकोणों को जोड़ने के लिए साझा करता हूं।

मुझे पता है कि ggplot को डेटाफ्रेम के साथ बेहतर तरीके से काम करने के लिए बनाया गया है, लेकिन शायद यह कभी-कभी यह जानना भी उपयोगी हो सकता है कि आप डेटाफ़्रेम का उपयोग किए बिना दो वैक्टर को सीधे प्लॉट कर सकते हैं।

डेटा लोड हो रहा है। मूल तिथि वेक्टर की लंबाई 100 है जबकि var0 और var1 की लंबाई 50 है, इसलिए मैं केवल उपलब्ध डेटा (पहले 50 तारीख) की साजिश रचता हूं।

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)    

प्लॉटिंग

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

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

हालाँकि मैं इस प्रारूप का उपयोग करके एक सही किंवदंती को जोड़ने में सक्षम नहीं था। क्या किसी को पता है कैसे?


1
यह एक पौराणिक कथा जोड़ता है 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
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.