आर में एक ही भूखंड में दो रेखांकन


570

मैं उसी प्लॉट में y1 और y2 प्लॉट करना चाहूंगा।

x  <- seq(-2, 2, 0.05)
y1 <- pnorm(x)
y2 <- pnorm(x, 1, 1)
plot(x, y1, type = "l", col = "red")
plot(x, y2, type = "l", col = "green")

लेकिन जब मैं इसे इस तरह से करता हूं, तो उन्हें एक साथ एक ही प्लॉट में प्लॉट नहीं किया जाता है।

मतलाब में कोई भी कर सकता है hold on, लेकिन क्या किसी को पता है कि आर में यह कैसे करना है?


3
जांच करें ?curve। का उपयोग करें add=TRUE
isomorphismes

अधिक विशिष्ट ggplot2 उत्तरों के लिए यह प्रश्न देखें ।
Axman

जवाबों:


617

lines()या points()मौजूदा ग्राफ़ में जोड़ देगा, लेकिन एक नई विंडो नहीं बनाएगा। तो आपको करने की आवश्यकता होगी

plot(x,y1,type="l",col="red")
lines(x,y2,col="green")

10
यह निम्न सरल उदाहरण में काम क्यों नहीं करता है? > कथानक (पाप)> रेखाएँ (cos) त्रुटि as.double (y) में: टाइप 'डबल' के वेक्टर के लिए 'बिलिन' के साथ ज़बरदस्ती नहीं कर सकते
फ्रैंक

23
यह देखना आसान है। साजिश (पाप) के साथ, आप वास्तविक डेटा के बजाय एक फ़ंक्शन पास कर रहे हैं। प्लॉट () इसका पता लगाएगा और बदले में प्लॉट.फंक्शन () आपके फंक्शन को प्लॉट करने के लिए (अधिक जानने के लिए कई प्रेषण पर पढ़ें)। हालाँकि, लाइन्स.फंक्शन () परिभाषित नहीं है, इसलिए लाइनों () को पता नहीं है कि क्लास फ़ंक्शन के पैरामीटर के साथ क्या करना है। लाइनें केवल आपके डेटा और क्लास टीएस की समय श्रृंखला वस्तुओं से निपट सकती हैं।
सौमेंद्र

27
@ फ्रेंक इसे ऐसे करें plot(sin); curve(cos, add=TRUE):।
isomorphismes

2
यदि x अलग है तो उसी का उपयोग कैसे करें? कहते हैं, मेरे पास एक ग्राफ़ के लिए X1 और y1 है और उसी ग्राफ़ में x2 और y2 का एक और ग्राफ़ जोड़ें। दोनों एक्स 1 और एक्स 2 में एक ही रेंज है लेकिन विभिन्न मूल्य हैं।
कविप्रिया

1
यह बिल्कुल वैसा ही है: lines(x2,y2,...)इसके बजायlines(x,y2,...)
bnaul

219

आप parएक ही ग्राफ पर अलग-अलग अक्ष पर भी उपयोग और प्लॉट कर सकते हैं । कुछ इस प्रकार है:

plot( x, y1, type="l", col="red" )
par(new=TRUE)
plot( x, y2, type="l", col="green" )

आप के बारे में विस्तार से पढ़ें parमें R, आप वास्तव में एक दिलचस्प ग्राफ़ बनाने में सक्षम हो जाएगा। पॉल मुरल के आर ग्राफिक्स को देखने के लिए एक और किताब है।


3
मेरा आर मुझे एक त्रुटि देता है: बराबर में त्रुटि (अंजीर (नया = ट्रू)): फ़ंक्शन नहीं मिल सका "अंजीर"
एलेसेंड्रो जैकॉपसन

5
क्या आपकी विधि दो भूखंडों के लिए सही पैमाने (y अक्ष) को संरक्षित करती है?
एलेसेंड्रो जैकप्सन

1
@uvts_cvs हाँ, यह टोटो में मूल ग्राफ को संरक्षित करता है।
सैम

10
इसके साथ समस्या यह है कि कई प्लॉट तत्वों को फिर से लिखा जाएगा। मैं शामिल करूंगा xlab="", ylab="", ...और दूसरे में कुछ अन्य plot
isomorphismes

118

बहुपरत भूखंडों का निर्माण करते समय किसी को ggplotपैकेज पर विचार करना चाहिए । विचार मूल सौंदर्यशास्त्र के साथ एक चित्रमय वस्तु बनाने और इसे बढ़ाने के लिए है।

ggplotशैली में डेटा को पैक करने की आवश्यकता होती है data.frame

# Data generation
x  <- seq(-2, 2, 0.05)
y1 <- pnorm(x)
y2 <- pnorm(x,1,1)
df <- data.frame(x,y1,y2)

मूल समाधान:

require(ggplot2)

ggplot(df, aes(x)) +                    # basic graphical object
  geom_line(aes(y=y1), colour="red") +  # first layer
  geom_line(aes(y=y2), colour="green")  # second layer

यहाँ + operator मूल वस्तु में अतिरिक्त परतों को जोड़ने के लिए उपयोग किया जाता है।

साथ ggplotआप की साजिश रचने के हर स्तर पर चित्रमय वस्तु की पहुंच है। कहते हैं, सामान्य चरण-दर-चरण सेटअप इस तरह दिख सकता है:

g <- ggplot(df, aes(x))
g <- g + geom_line(aes(y=y1), colour="red")
g <- g + geom_line(aes(y=y2), colour="green")
g

gकथानक का निर्माण करता है, और आप इसे हर चरण (अच्छी तरह से, कम से कम एक परत के निर्माण के बाद) में देख सकते हैं। निर्मित वस्तु के साथ कथानक के अन्य आकर्षण भी बनाए गए हैं। उदाहरण के लिए, हम एक्साइज के लिए लेबल जोड़ सकते हैं:

g <- g + ylab("Y") + xlab("X")
g

अंतिम gजैसा दिखता है:

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

अद्यतन (2013-11-08):

जैसा कि टिप्पणियों में बताया गया है, ggplotदर्शन लंबे प्रारूप में डेटा का उपयोग करने का सुझाव देता है। संबंधित कोड को देखने के लिए आप इस उत्तर को संदर्भित कर सकते हैं ।


5
जैसा कि हेनरिक द्वारा सुझाया गया है , डेटा वास्तव में "लंबे" प्रारूप में होना चाहिए, ggplotयह आपके द्वारा उपयोग किए जाने वाले "विस्तृत" प्रारूप की तुलना में अधिक स्वाभाविक रूप से संभालता है।
krlmlr

1
@ हेनरिक: नहीं, पहली बार में आपके जवाब के लिए धन्यवाद। शायद इस जवाब के लेखक इसे संपादित कर सकते हैं ताकि यह ggplotदर्शन के साथ अच्छी तरह से फिट हो ...
krlmlr

1
@krlmlr, मैंने अपने उत्तर को संपादित करने की कोशिश की ताकि यह प्रश्न को अधिक स्पष्ट रूप से संबोधित करे। कृपया आगे के अपडेट का सुझाव देने के लिए स्वतंत्र महसूस करें। चीयर्स।
हेनरिक

3
मुझे ggplot (anes ()) पर x को परिभाषित करना सिखाया और उसके बाद geom _ * () पर खुद को y किया। अच्छा!
दान

41

मुझे लगता है कि जवाब आप के लिए देख रहे हैं:

plot(first thing to plot)
plot(second thing to plot,add=TRUE)

25
यह काम नहीं करता है, यह एक "add" is not a graphical parameterचेतावनी देता है तो बस दूसरे प्लॉट को पहले एक से अधिक प्रिंट करता है।
वाल्दिर लियोनसियो


इसका एक अच्छा लाभ यह है कि यह कुल्हाड़ियों की सीमा और शीर्षकों को सुसंगत रखता है। पिछले तरीकों में से कुछ R को y अक्ष पर टिक के निशान के दो सेट खींचने का कारण बनता है, जब तक कि आप अधिक विकल्पों को निर्दिष्ट करने की परेशानी से नहीं गुजरते हैं। कहने की जरूरत नहीं है कि कुल्हाड़ियों पर टिक के निशान के दो सेट होने से बहुत भ्रामक हो सकता है।
RMurphy

1
कुछ प्लॉट विधियों के लिए एड पैरामीटर काम करता है, लेकिन आधार नहीं / डिफ़ॉल्ट आर में एक
क्लाउडकंप्यूट्स

2
मुझे वही त्रुटि मिली "add" is not a graphical parameter। मेरा आर है R version 3.2.3 (2015-12-10)। आप par(new=TRUE)इन भूखंडों के बीच कमांड का उपयोग कर सकते हैं ।
क्वास

29

matplotफ़ंक्शन का उपयोग करें :

matplot(x, cbind(y1,y2),type="l",col=c("red","green"),lty=c(1,1))

इस का उपयोग करें y1और अगर y2एक ही xबिंदु पर मूल्यांकन कर रहे हैं । यह जो भी बड़ा हो ( y1या y2) फिट करने के लिए Y- अक्ष को तराजू देता है , यहां कुछ अन्य उत्तरों के विपरीत, जो y2इससे अधिक होने पर क्लिप करेंगेy1 (ggplot के समाधान ज्यादातर इस के साथ ठीक हैं)।

वैकल्पिक रूप से, और यदि दो पंक्तियों में समान x- निर्देशांक नहीं हैं, तो पहले भूखंड पर अक्ष सीमाएँ सेट करें और जोड़ें:

x1  <- seq(-2, 2, 0.05)
x2  <- seq(-3, 3, 0.05)
y1 <- pnorm(x1)
y2 <- pnorm(x2,1,1)

plot(x1,y1,ylim=range(c(y1,y2)),xlim=range(c(x1,x2)), type="l",col="red")
lines(x2,y2,col="green")

चकित हूं कि यह Q 4 साल पुराना है और किसी ने इसका उल्लेख नहीं किया है matplotया x/ylim...


25

tl; dr: आप curve(के साथ add=TRUE) या का उपयोग करना चाहते हैं lines


मैं इससे सहमत नहीं हूं par(new=TRUE)क्योंकि यह टिक-मार्क और एक्सिस लेबल को डबल-प्रिंट करेगा। उदाहरण के लिए

साइन और परबोला

का उत्पादन plot(sin); par(new=T); plot( function(x) x**2 )

देखो कि कैसे ऊर्ध्वाधर अक्ष लेबल गड़बड़ कर रहे हैं! चूंकि सीमाएं अलग-अलग हैं जिन्हें आपको सेट करने की आवश्यकता होगी ylim=c(lowest point between the two functions, highest point between the two functions), जो कि मैं जो आपको दिखाने जा रहा हूं, उससे कम आसान है --- और कम आसान है यदि आप न केवल दो घटता जोड़ना चाहते हैं, बल्कि कई।


साजिश रचने के बारे में मुझे हमेशा जो उलझन होती है, वह है curveऔर lines(यदि आपको याद नहीं है कि ये दो महत्वपूर्ण प्लॉटिंग कमांड्स के नाम हैं, तो बस गाएं इसे ।)

यहाँ के बीच बड़ा अंतर है curveऔर lines

curveकी तरह एक समारोह की साजिश होगी curve(sin)linesप्लॉट x और y मानों के साथ इंगित करता है, जैसे lines( x=0:10, y=sin(0:10) ):।

और यहाँ एक मामूली अंतर है: आपको जो करने की कोशिश की जा रही है, उसके लिए curveबुलाया add=TRUEजाना चाहिए, जबकि linesपहले से ही माना जाता है कि आप मौजूदा प्लॉट में जोड़ रहे हैं।

आईडी और साइन

यहाँ कॉलिंग का परिणाम है plot(0:2); curve(sin)


पर्दे के पीछे, बाहर की जाँच करें methods(plot)। और जांच करें body( plot.function )[[5]]। जब आप plot(sin)R आंकड़े कहते हैं जो sinएक फ़ंक्शन है (y मान नहीं) और plot.functionविधि का उपयोग करता है , जो कॉलिंग को समाप्त करता है curve। तो curveउपकरण है जो कार्यों को संभालने के लिए है।


17

यदि आप प्लॉट को दो कॉलम (एक दूसरे के बगल में 2 प्लॉट) में विभाजित करना चाहते हैं, तो आप इसे इस तरह कर सकते हैं:

par(mfrow=c(1,2))

plot(x)

plot(y) 

संदर्भ लिंक


16

जैसा कि @redmode द्वारा वर्णित है, आप एक ही चित्रमय डिवाइस का उपयोग करके दो लाइनों को प्लॉट कर सकते हैं ggplot। उस उत्तर में डेटा एक 'विस्तृत' प्रारूप में था। हालांकि, ggplotइसका उपयोग करते समय आम तौर पर डेटा को 'लंबे' प्रारूप में डेटा फ्रेम में रखना सबसे सुविधाजनक होता है। फिर, में विभिन्न 'समूहीकरण चर' का उपयोग करकेaes इन्टिक्स के तर्कों लाइन के गुण, जैसे लिनेटाइप या कलर, ग्रुपिंग वैरिएबल के अनुसार अलग-अलग होंगे, और इसी तरह की किंवदंतियाँ दिखाई देंगी।

इस मामले में, हम colourएस्थेटिक्स का उपयोग कर सकते हैं , जो डेटा सेट में एक चर के विभिन्न स्तरों के लिए लाइनों के रंग से मेल खाता है (यहां: y1 बनाम y2)। लेकिन पहले हमें reshape2पैकेज से फ़ंक्शन 'पिघल' का उपयोग करके डेटा को विस्तृत से लंबे प्रारूप में पिघलाना होगा । डेटा को फिर से आकार देने के अन्य तरीके यहाँ वर्णित हैं: डेटा को फिर से आकार देना। विस्तृत से लंबे प्रारूप में

library(ggplot2)
library(reshape2)

# original data in a 'wide' format
x  <- seq(-2, 2, 0.05)
y1 <- pnorm(x)
y2 <- pnorm(x, 1, 1)
df <- data.frame(x, y1, y2)

# melt the data to a long format
df2 <- melt(data = df, id.vars = "x")

# plot, using the aesthetics argument 'colour'
ggplot(data = df2, aes(x = x, y = value, colour = variable)) + geom_line()

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


15

यदि आप आधार ग्राफिक्स (यानी जाली / ग्रिड ग्राफिक्स का उपयोग नहीं कर रहे हैं), तो आप नए प्लॉट को शुरू किए बिना अपने भूखंडों में अतिरिक्त विवरण जोड़ने के लिए पॉइंट / लाइन्स / पॉलीगॉन फ़ंक्शन का उपयोग करके MATLAB की पकड़ की नकल कर सकते हैं। मल्टीप्लेट लेआउट के मामले में, आप par(mfg=...)चीजों को जोड़ने के लिए किस प्लॉट का उपयोग कर सकते हैं ।


14

आप ओवरप्लॉट के लिए अंक का उपयोग कर सकते हैं, अर्थात्।

plot(x1, y1,col='red')

points(x2,y2,col='blue')

7

किसी सरणी में प्लॉट किए जाने वाले मानों को रखने के बजाय, उन्हें एक मैट्रिक्स में स्टोर करें। डिफ़ॉल्ट रूप से पूरे मैट्रिक्स को एक डेटा सेट के रूप में माना जाएगा। हालाँकि यदि आप प्लॉट में समान संशोधक जोड़ते हैं, जैसे कि कर्नल (), जैसा कि आपके पास मैट्रिक्स में पंक्तियाँ हैं, तो आर यह पता लगाएगा कि प्रत्येक पंक्ति को स्वतंत्र रूप से व्यवहार किया जाना चाहिए। उदाहरण के लिए:

x = matrix( c(21,50,80,41), nrow=2 )
y = matrix( c(1,2,1,2), nrow=2 )
plot(x, y, col("red","blue")

यह तब तक काम करना चाहिए जब तक कि आपके डेटा सेट अलग-अलग आकार के न हों।


यह देता है: अगर (as.factor) में त्रुटि {: तर्क तार्किक के रूप में व्याख्या करने योग्य नहीं है
baouss

5

मुहावरेदार मतलाब plot(x1,y1,x2,y2)को R ggplot2में इस प्रकार से अनुवाद किया जा सकता है :

x1 <- seq(1,10,.2)
df1 <- data.frame(x=x1,y=log(x1),type="Log")
x2 <- seq(1,10)
df2 <- data.frame(x=x2,y=cumsum(1/x2),type="Harmonic")

df <- rbind(df1,df2)

library(ggplot2)
ggplot(df)+geom_line(aes(x,y,colour=type))

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

Ggplot2 का उपयोग करके एक्स-अक्ष के विभिन्न रेंज के साथ झिंगा की दोहरी लाइन भूखंडों से प्रेरित है ।


5

आप किसी भी gggplot2 उदाहरण में से किसी एक को इंटरएक्टिव प्लॉट में बदलने के ggplotly()लिए प्लॉटली पैकेज से फ़ंक्शन का उपयोग कर सकते हैं , लेकिन मुझे लगता है कि इस तरह का प्लॉट ggplot2 के बिना बेहतर है :

# call Plotly and enter username and key
library(plotly)
x  <- seq(-2, 2, 0.05)
y1 <- pnorm(x)
y2 <- pnorm(x, 1, 1)

plot_ly(x = x) %>%
  add_lines(y = y1, color = I("red"), name = "Red") %>%
  add_lines(y = y2, color = I("green"), name = "Green")

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


स्पष्ट रूप से शानदार लग रहा है; क्या ये मुफ्त में है ?
डेनिस

@denis, असीमित मुफ्त सार्वजनिक प्लॉटिंग और भुगतान किए गए निजी प्लॉटिंग या ऑन-प्रिमाइसेस विकल्प हैं। योजना पृष्ठ देखें ।
मेटो सांचेज

4
प्लाटली आर पैकेज अब 100% मुफ्त और खुला स्रोत (MIT लाइसेंस प्राप्त) है। आप इसके साथ या बिना किसी खाते के उपयोग कर सकते हैं।
कार्सन

4

आप ggvis का उपयोग करके अपना प्लॉट भी बना सकते हैं :

library(ggvis)

x  <- seq(-2, 2, 0.05)
y1 <- pnorm(x)
y2 <- pnorm(x,1,1)
df <- data.frame(x, y1, y2)

df %>%
  ggvis(~x, ~y1, stroke := 'red') %>%
  layer_paths() %>%
  layer_paths(data = df, x = ~x, y = ~y2, stroke := 'blue')

यह निम्नलिखित कथानक का निर्माण करेगा:

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


2

उपयोग करना plotly( plotlyप्राथमिक और माध्यमिक y अक्ष से समाधान जोड़ना- यह गायब प्रतीत होता है):

library(plotly)     
x  <- seq(-2, 2, 0.05)
y1 <- pnorm(x)
y2 <- pnorm(x, 1, 1)

df=cbind.data.frame(x,y1,y2)

  plot_ly(df) %>%
    add_trace(x=~x,y=~y1,name = 'Line 1',type = 'scatter',mode = 'lines+markers',connectgaps = TRUE) %>%
    add_trace(x=~x,y=~y2,name = 'Line 2',type = 'scatter',mode = 'lines+markers',connectgaps = TRUE,yaxis = "y2") %>%
    layout(title = 'Title',
       xaxis = list(title = "X-axis title"),
       yaxis2 = list(side = 'right', overlaying = "y", title = 'secondary y axis', showgrid = FALSE, zeroline = FALSE))

कार्यशील डेमो से स्क्रीनशॉट:

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


मैंने कोड संकलित किया है और काम नहीं करता है, पहले%>% में एक त्रुटि को चिह्नित किया और मैंने इसे हटा दिया, फिर एक त्रुटि चिह्नित की Error in library(plotly) : there is no package called ‘plotly’क्यों?
बेलाट्रिक्स 20

क्या आपने पैकेज स्थापित किया है plotly? आपको install.packages("plotly")कमांड का उपयोग करके पैकेज स्थापित करना होगा ।
सौरभ चौहान

1

हम जाली पुस्तकालय का भी उपयोग कर सकते हैं

library(lattice)
x <- seq(-2,2,0.05)
y1 <- pnorm(x)
y2 <- pnorm(x,1,1)
xyplot(y1 + y2 ~ x, ylab = "y1 and y2", type = "l", auto.key = list(points = FALSE,lines = TRUE))

विशिष्ट रंगों के लिए

xyplot(y1 + y2 ~ x,ylab = "y1 and y2", type = "l", auto.key = list(points = F,lines = T), par.settings = list(superpose.line = list(col = c("red","green"))))

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

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