r - आर में एक ही साजिश में दो ग्राफ प्लॉट करें




plot ggplot2 (10)

मैं एक ही साजिश में 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")

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

Matlab में कोई hold on सकता है, लेकिन क्या कोई जानता है कि आर में यह कैसे करें?


Idiomatic Matlab plot(x1,y1,x2,y2) का अनुवाद 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 का उपयोग कर एक्स-अक्ष की विभिन्न श्रृंखला के साथ झाओ के दोहरी रेखा भूखंडों को झुकाकर प्रेरित किया


अगर आप स्क्रीन को विभाजित करना चाहते हैं, तो आप इसे इस तरह से कर सकते हैं:

(उदाहरण के लिए एक साथ अगले 2 भूखंडों के लिए)

par(mfrow=c(1,2))

plot(x)

plot(y) 

संदर्भ लिंक


आप इसे स्टाइल करने के लिए प्लॉटली आर एपीआई का उपयोग कर सकते हैं। ऐसा करने के लिए कोड नीचे दिया गया है, और इस ग्राफ का लाइव संस्करण here

# call Plotly and enter username and key
library(plotly)
p <- plotly(username="Username", key="API_KEY")

# enter data
x  <- seq(-2, 2, 0.05)
y1 <- pnorm(x)
y2 <- pnorm(x,1,1)

# format, listing y1 as your y.
First <- list(
x = x,
y = y1,
type = 'scatter',
mode = 'lines',
marker = list(
    color = 'rgb(0, 0, 255)',
    opacity = 0.5
 )
)

# format again, listing y2 as your y.
Second <- list(
x = x,
y = y2,
type = 'scatter',
mode = 'lines',
opacity = 0.8, 
marker = list(
    color = 'rgb(255, 0, 0)'
 )
)

# style background color
plot_bgcolor = 'rgb(245,245,247)'

# and structure the response. Plotly returns a URL when you make the call. 
response<-p$plotly(list(First,Second), kwargs = list(layout=layout))

पूर्ण प्रकटीकरण: मैं प्लॉटली टीम पर हूं।


आप एक ही ग्राफ पर अलग-अलग अक्ष पर par और साजिश का उपयोग भी कर सकते हैं। निम्नानुसार कुछ:

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

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


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

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


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

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

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


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


ggplot प्लॉट्स का निर्माण करते समय किसी को 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 का दर्शन लंबे प्रारूप में डेटा का उपयोग करने का सुझाव देता है। संबंधित कोड देखने के लिए आप इस जवाब https://.com/a/19039094/1796914 देख सकते हैं।


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

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

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

वैकल्पिक रूप से, और यदि दोनों पंक्तियों में एक ही एक्स-निर्देशांक नहीं हैं, तो पहले प्लॉट पर धुरी सीमा निर्धारित करें और जोड़ें:

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

मुझे आश्चर्य है कि यह क्यू 4 साल पुराना है और किसी ने matplot या x/ylim का उल्लेख नहीं किया है ...


टीएल; डॉ: आप curve ( add=TRUE ) या lines का उपयोग करना चाहते lines

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

plot(sin); par(new=T); plot( function(x) x**2 ) का उत्पादन plot(sin); par(new=T); plot( function(x) x**2 ) plot(sin); par(new=T); plot( function(x) x**2 ) 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 बीच अंतर है। (यदि आपको याद नहीं है कि ये दो महत्वपूर्ण साजिश आदेशों के नाम हैं, तो बस इसे sing ।)

curve और lines बीच बड़ा अंतर यहां दिया गया है।

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

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

कॉलिंग plot(0:2); curve(sin) का नतीजा यहां दिया गया है plot(0:2); curve(sin) plot(0:2); curve(sin)

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





r-faq