R में एक ग्राफ पर कई प्लॉट बनाएं?


13

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

  1. कोई मेरी मदद कर सकता है एक अच्छा ग्राफ चार भूखंडों का उत्पादन करने के लिए?

  2. मैं डिफ़ॉल्ट 5 लेबल के बजाय 1 से 10 तक एक्स-अक्ष लेबल कैसे रख सकता हूं?

डेटा:

a1: 11.013 13.814 13.831 13.714 13.787 13.734 13.778 13.771 13.823 13. 13.259

a2: 5.181 7.747 8.314 8.061 7.920 8.153 8.540 8.845 7.881 8.301

मैंने बी 1, सी 1, और डी 1 के लिए ए 1 डेटा का उपयोग किया है; बी 2, सी 2, और डी 2 के लिए a2 डेटा सिर्फ यहाँ के लिए।

चित्र:

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

कोड:

        op=par(mfrow=c(4,1), mar=c(5.5,5.1,4.1,2.1))
        plot(a1, type="b", ylim=c(0,14.5), xlab="Time (secs)", ylab="", cex.axis=1.4, cex.lab=1.3,cex=1.2,lwd=2.5,col="red1",lty=2,pch=1, main="A")
        lines(a2,type="b",pch=3,lty=3,col="darkblue",lwd=2.5,cex=1.2)
        par(xpd=T)
        legend(1,26.5,c("X","Y"),bty="n",horiz=T,cex=1.5,col=c("red1","darkblue"),text.col=c("red1","darkblue"),pch=c(1,3),lty=c(2,3),x.intersp=0.4,adj=0.2)
        plot(b1, type="b", ylim=c(0,14.5), xlab="Time (secs)", ylab="", cex.axis=1.4, cex.lab=1.3,cex=1.2,lwd=2.5,col="red1",lty=2,pch=1, main="B")
        lines(b2,type="b",pch=3,lty=3,col="darkblue",lwd=2.5,cex=1.2)
        plot(c1, type="b", ylim=c(0,14.5), xlab="Time (secs)", ylab="", cex.axis=1.4, cex.lab=1.3,cex=1.2,lwd=2.5,col="red1",lty=2,pch=1, main="C")
        lines(c2,type="b",pch=3,lty=3,col="darkblue",lwd=2.5,cex=1.2)
        plot(d1/1000, type="b", ylim=c(0,14.5), xlab="Time (secs)", ylab="", cex.axis=1.4, cex.lab=1.3,cex=1.2,lwd=2.5,col="red1",lty=2,pch=1, main="D")
        lines(d2,type="b",pch=3,lty=3,col="darkblue",lwd=2.5,cex=1.2)
   > mtext("Price", side=2, at=100,line=3,cex=1.1)

1
क्या आप अपने डेटा का विवरण दे सकते हैं? संभवतः, dput (data_from_r)
suncoolsu

@suncoolsu, मैंने डेटा के नमूने के साथ सवाल अपडेट किया है। धन्यवाद।
समरसता

क्या होगा यदि आपके पास एक किंवदंती के साथ एक ही अक्ष पर 2 रंग और 4 लाइन प्रकार हैं? मैं उसके लिए कोड और परिणाम देखना चाहता हूं।
पॉल

@ user87: चूंकि 4 प्लॉट 4 अलग-अलग प्रयोगों से हैं। इसलिए, मुझे लगता है कि प्रयोगों से परिणामों का विश्लेषण करने के लिए 4 भूखंडों को खींचना बेहतर है।
समरसा

@ user87, मुझे यकीन नहीं है कि आपका क्या मतलब है। शायद अगर आपने एक नया प्रश्न शुरू किया तो कोई इसका उत्तर देगा (I :):)
ब्रैंडन बर्टेल्सन

जवाबों:


16

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

layout(matrix(1:5, ncol = 1), widths = 1,
        heights = c(1,5,5,5,7), respect = FALSE)
par(mar=c(0, 4, 0, 0))
plot(1, type = 'n', axes = FALSE, bty = 'n', ylab = '')
legend('left', , c("X","Y"), bty="n", horiz=T, cex=1.5, col=c("red1","darkblue"), text.col=c("red1","darkblue"), pch=c(1,3), lty=c(2,3), x.intersp=0.4,adj=0.2)
par(mar=c(0, 4, 2, 1), bty = 'o')
plot(a1, type="b", ylim=c(0,14.5), xlab="Time (secs)", ylab="", xaxt = 'n', cex.axis=1.4, cex.lab=1.3,cex=1.2, lwd=2.5, col="red1", lty=2, pch=1, main="A")
lines(a2,type="b",pch=3,lty=3,col="darkblue",lwd=2.5,cex=1.2)
par(xpd=T)
plot(b1, type="b", ylim=c(0,14.5), xlab="Time (secs)", ylab="", xaxt = 'n', cex.axis=1.4, cex.lab=1.3,cex=1.2,lwd=2.5,col="red1",lty=2,pch=1, main="B")
lines(b2,type="b",pch=3,lty=3,col="darkblue",lwd=2.5,cex=1.2)
plot(c1, type="b", ylim=c(0,14.5), xlab="Time (secs)", ylab="", xaxt = 'n', cex.axis=1.4, cex.lab=1.3,cex=1.2,lwd=2.5,col="red1",lty=2,pch=1, main="C")
lines(c2,type="b",pch=3,lty=3,col="darkblue",lwd=2.5,cex=1.2)
par(mar=c(4, 4, 2, 1))
plot(d1/1000, type="b", ylim=c(0,14.5), xlab="Time (secs)", ylab="", xaxt = 'n', cex.axis=1.4, cex.lab=1.3,cex=1.2,lwd=2.5,col="red1",lty=2,pch=1, main="D")
lines(d2,type="b",pch=3,lty=3,col="darkblue",lwd=2.5,cex=1.2)
mtext("Price", side=2, at=40,line=2.5,cex=1.1)
axis(1, 1:10, cex.axis = 1.4)

प्लॉट

मुझे ध्यान देना चाहिए कि मैंने वास्तव में इसे अच्छा बनाने में कोई प्रयास नहीं किया था जितना कि मैं कर सकता था और उस पहले डमी ग्राफ को बनाने के बजाय मैं पहले फ्रेम में पर्याप्त स्थान निर्धारित कर सकता था। दुर्भाग्य से मार्च () सेटिंग फ्रेम को भरने की कोशिश करता है और शीर्ष मार्जिन दूरी को प्रभावित करता है कि ग्राफ के ऊपर का लेबल दूर है इसलिए मुझे सिर्फ उपयोग करने के बजाय mtext () या पाठ () के साथ अपने सभी लेबल बनाने होंगे। साजिश के भीतर मुख्य सेटिंग और मुझे ऐसा करने का मन नहीं था


बदमाश आधार ग्राफिक्स के लिए दूसरा +1। मैंने लेआउट () कमांड के साथ कुछ अच्छा लिखने की व्यर्थ कोशिश की है। अगली बार जब मैं इसका उपयोग करने की आवश्यकता होगी तो मैं यहां वापस आऊंगा।
बजे क्रिस बीले

13

मैं जाली ग्राफिक्स पैकेज सीखने की सलाह दूंगा। मैं कुछ पंक्तियों के साथ आप जो चाहता हूं, उसके करीब पहुंच सकता हूं। सबसे पहले, डेटा फ्रेम में अपना डेटा पैकेज करें, कुछ इस तरह से:

dat <- data.frame (x=rep (1:10, 8), y=c(a1, a2, b1, b2, c1, c2, d1, d2),
        var=factor (rep (c("X", "Y"), each=10)),
        graph=factor (rep (c("A", "B", "C", "D"), each=20)))

कौन सी पैदावार:

    x           y var graph
1   1 0.556372979   X     A
2   2 0.754257646   X     A
3   3 0.815432905   X     A
4   4 0.559513013   X     A
5   5 0.763368168   X     A
6   6 0.426415259   X     A
7   7 0.597962532   X     A
8   8 0.723780143   X     A
9   9 0.228920116   X     A
10 10 0.607378894   X     A
11  1 0.865114425   Y     A
12  2 0.919804947   Y     A
13  3 0.437003794   Y     A
14  4 0.203349303   Y     A
15  5 0.620425977   Y     A
16  6 0.703170299   Y     A
17  7 0.174297656   Y     A
18  8 0.698144659   Y     A
19  9 0.732527016   Y     A
20 10 0.778057398   Y     A
21  1 0.355583032   X     B
22  2 0.015765144   X     B
23  3 0.315004753   X     B
24  4 0.257723585   X     B
25  5 0.506324279   X     B
26  6 0.028634427   X     B
27  7 0.475360443   X     B
28  8 0.577119754   X     B
29  9 0.709063777   X     B
30 10 0.308695235   X     B
31  1 0.852567748   Y     B
32  2 0.938889121   Y     B
33  3 0.080869739   Y     B
34  4 0.732318482   Y     B
35  5 0.325673156   Y     B
36  6 0.378161864   Y     B
37  7 0.830962248   Y     B
38  8 0.990504039   Y     B
39  9 0.331377188   Y     B
40 10 0.448251682   Y     B
41  1 0.967255983   X     C
42  2 0.722894624   X     C
43  3 0.039523960   X     C
44  4 0.003774719   X     C
45  5 0.218605160   X     C
46  6 0.722304874   X     C
47  7 0.576140686   X     C
48  8 0.108219812   X     C
49  9 0.258440127   X     C
50 10 0.739656846   X     C
51  1 0.528278201   Y     C
52  2 0.104415716   Y     C
53  3 0.966076056   Y     C
54  4 0.504415150   Y     C
55  5 0.655384900   Y     C
56  6 0.247340395   Y     C
57  7 0.193857228   Y     C
58  8 0.019133583   Y     C
59  9 0.799404908   Y     C
60 10 0.159209090   Y     C
61  1 0.422574508   X     D
62  2 0.823192614   X     D
63  3 0.808715876   X     D
64  4 0.770499188   X     D
65  5 0.049138399   X     D
66  6 0.747017767   X     D
67  7 0.239916970   X     D
68  8 0.152777362   X     D
69  9 0.052862276   X     D
70 10 0.937605577   X     D
71  1 0.850112019   Y     D
72  2 0.675407232   Y     D
73  3 0.273276166   Y     D
74  4 0.455995477   Y     D
75  5 0.695497498   Y     D
76  6 0.688414035   Y     D
77  7 0.454013633   Y     D
78  8 0.874853452   Y     D
79  9 0.568746031   Y     D

फिर, जाली का उपयोग करें xyplot:

library (lattice)
xyplot (y ~ x | graph, groups=var, data=dat, type="o",
        layout=c(1, 4), as.table=T, xlab="Time (secs)", ylab="Price")

जो एक अच्छा ग्राफ देता है:

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

संपादित करें:

यदि आप अलग-अलग प्रतीक और रेखाएँ रखना चाहते हैं और आपकी किंवदंती में यह दिखाई देता है, तो यह जटिल हो जाता है, क्योंकि आप शाब्दिक रूप से किंवदंती का निर्माण करते हैं, और आपको यह जानना होगा कि यदि आपने खुद को ओवरराइड नहीं किया तो डिफ़ॉल्ट जाली रंग कैसे प्राप्त करें। :

my.text <- levels (dat$var)
my.lty <- c(2, 3)
my.pch <- c(1, 2)
my.col <- trellis.par.get ("superpose.symbol")$col[1:2]
xyplot (y ~ x | graph, groups=var, data=dat, type="o", pch=my.pch, lty=my.lty,
        main="Main Title", layout=c(1, 4), as.table=T, xlab="Time (secs)", ylab="Price",
        key=list (columns=2, text=list (my.text), points=list (pch=my.pch, col=my.col)))

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

संपादित करें 2:

आप कोड और ग्राफ को सरल बना सकते हैं, यदि दो श्रेणियां वास्तव में "X" और "Y" जैसी सरल हों:

xyplot (y ~ x | graph, groups=var, data=dat, type="o", pch=c("X", "Y"), cex=1.25, lty=c(2, 3),
        layout=c(1, 4), as.table=T, xlab="Time (secs)", ylab="Price")

जो बिंदु प्रतीकों के रूप में "X" और "Y" का उपयोग करेगा। आपको बिल्कुल एक किंवदंती की आवश्यकता नहीं है, और फिर स्वयं ग्राफ़ को और भी अधिक स्थान समर्पित कर सकते हैं। (दूसरी ओर, आप लुक को पसंद नहीं कर सकते हैं, या बिंदु के सटीक केंद्र को निर्धारित करने के लिए यह कठिन लग सकता है, हालांकि यह उतना मुद्दा नहीं है जितना कि यह हो सकता है क्योंकि लाइन प्रत्येक बिंदु से गुजरती है।)

संपादित करें 3:

दरअसल, आपको strip=F, strip.left=T,ग्राफ के बाईं ओर A, B, C, D, लेबल लगाने के लिए प्लॉट में जोड़ना चाहिए , जो आपको इस तरह लंबे ग्राफ पर अधिक जगह देता है:

xyplot (y ~ x | graph, groups=var, data=dat, type="o", pch=my.pch, lty=my.lty,
        main="Main Title", layout=c(1, 4), as.table=T, xlab="Time (secs)", ylab="Price",
        strip.left=T, strip=F,
        key=list (columns=2, text=list (my.text), points=list (pch=my.pch, col=my.col),
        lines=list (lty=my.lty, col=my.col)))

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


@Wayne: मैं ऑटो के साथ ग्राफ के शीर्ष पर एक किंवदंती रखने की कोशिश कर रहा हूं। अंतरिक्ष = "शीर्ष", pch = c (1,2), lty = c (2,4) के तर्क के साथ, लेकिन pch मान और lty मान काम नहीं कर रहे हैं। इसके अलावा, मैं किंवदंती में एक्स और वाई को क्षैतिज रखना चाहूंगा। क्या आप इसके लिए मेरी मदद कर सकते हैं।
समरसता

हाँ। मुझे एक कागज पर एक्स और वाई को अलग करने के लिए विभिन्न पीच मानों का उपयोग करने की आवश्यकता है। मैं xyplot में तर्क pch (1,4) जोड़कर प्लॉट में विभिन्न pch मानों का उपयोग करने में सक्षम हूं, लेकिन यह किंवदंती पर प्रतिबिंबित नहीं कर रहा है। कृपया मुझे बताएं कि मैं किंवदंती में एक्स और वाई के लिए विभिन्न पीच मानों का उपयोग कैसे कर सकता हूं।
समरसता

ठीक है, मैंने एक बार घर आने के बाद इसका पता लगा लिया और पुस्तक से परामर्श किया। संपादित संस्करण देखें।
वेन

कोई दिक्कत नहीं है। मुझे लगता है कि मेरा ईडीआईटी 3 आपको अपने मूल के समान (लेकिन बेहतर दिखने और अधिक रेखांकन के साथ) के समान सबसे अच्छा ग्राफ देता है। मैंने किंवदंती को स्थानांतरित नहीं किया, जो मुझे लगता है कि काफी सीधा है। यदि आप चाहते हैं कि रेखा किंवदंती में बिंदु से गुजरती है, तो मुझे लगता है कि आपको इसे अगले जटिलता के स्तर पर ले जाना होगा और ड्रा करना होगा। सामान जो कि कस्टम ग्रब्स बनाते हैं (एक gridचीज़: जाली और ggplot2 ग्रिड पर निर्माण) ।
वायने

हां, अब ग्राफ बेहतर है। हालांकि, यह वास्तव में अच्छा होगा अगर हम किंवदंती में रेखा के ऊपर बिंदु प्राप्त करें जैसे कि हम सामान्य प्लॉट फ़ंक्शन के साथ प्राप्त करते हैं।
समरसता

9

यहाँ @ ब्रैंडन ggplot2समाधान का एक संस्करण है जो वांछित कथा व्यवहार को शामिल करता है:

dat <- data.frame (x=rep (1:10, 8), y=runif(80),
        var=factor (rep (c("X", "Y"), each=10)),
        graph=factor (rep (c("A", "B", "C", "D"), each=20)))

ggplot(data = dat,aes(x = x, y = y)) + 
    facet_wrap(~graph,nrow = 4) + 
    geom_point(aes(shape = var)) + 
    geom_line(aes(colour = var, group = var)) + 
    labs(x = NULL, y = NULL, shape = "", colour = "") + 
    theme_bw() + 
    opts(legend.position = "top", legend.direction = "horizontal")

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

मैं किंवदंतियों को ggplot2YMMV में बहुत आसान मानता हूं ।

संपादित करें

टिप्पणियों में कुछ सवालों को संबोधित करते हुए। खास बिंदु या लाइन प्रकार निर्दिष्ट करने के लिए, आप का प्रयोग करेंगे scale_aesthetic_manualजहां aestheticया तो है shape, linetypeआदि उदाहरण के लिए,:

ggplot(data = dat,aes(x = x, y = y)) + 
    facet_wrap(~graph,nrow = 4) + 
    geom_point(aes(shape = var)) + 
    geom_line(aes(colour = var, linetype = var, group = var)) + 
    labs(x = NULL, y = NULL, shape = "", colour = "", linetype = "") + 
    scale_shape_manual(values = 4:5) +
    theme_bw() + 
    opts(legend.position = "top", legend.direction = "horizontal")

विभिन्न अक्ष लेबल का आकार बदलना थीम में सेटिंग्स को बदलकर आमतौर पर उपयोग किया जाता है opts()। उदाहरण के लिए:

ggplot(data = dat,aes(x = x, y = y)) + 
    facet_wrap(~graph,nrow = 4) + 
    geom_point(aes(shape = var)) + 
    geom_line(aes(colour = var, linetype = var, group = var)) + 
    labs(x = "X Label", y = "Y Label", shape = "", colour = "", linetype = "") + 
    theme_bw() + 
    opts(legend.position = "top", legend.direction = "horizontal",
         axis.text.x = theme_text(size = 15),axis.title.y = theme_text(size = 25, angle = 90))

आपको वास्तव में अधिक जानकारी के लिए वेबसाइट और उसकी पुस्तक में गोता लगाना चाहिए ।


2
मैं अक्सर ggplot2 पसंद करता हूं। वास्तव में मैंने ggplot2 के साथ एक त्वरित कोशिश की, जब जाली बहुत जटिल हो रही थी, और पाया कि मैं बिंदु / रेखा शैलियों को ठीक से प्रतिबिंबित करने के लिए किंवदंती प्राप्त नहीं कर सकता था यदि मैं आकार और रेखा शैलियों को स्पष्ट रूप से चुनना चाहता था। मैंने शायद इसे गलत तरीके से किया था, और यह ग्राफ में काम करने में कामयाब रहा, लेकिन ggplot की किंवदंती रचना को बेवकूफ बना दिया। क्या आप देख सकते हैं कि यह आपके लिए काम करता है और कोड पोस्ट करता है?
वेन

@ जोरान: मैंने लिनेपेट्स और पॉइंटटाइप्स और रंगों को बदलने के लिए यह जानने की कोशिश की, लेकिन कोई सफलता नहीं मिली। क्या आप हमें यह बता सकते हैं कि हम लिनेटिप आदि को कैसे बदल सकते हैं, और कृपया यह भी बताएं कि हम x और y लैब के आकार को कैसे बढ़ा सकते हैं।
समरसा

मैं इस समय अपने फ़ोन पर हूँ; यदि @Brandon अपने उत्तर को संपादित नहीं करता है, तो इससे पहले कि मैं आपके लिए देख रहा हूं, मैं आज रात के बाद मिलूंगा।
जोरान

8

वेन के जवाब के समान, मैं भी एक अलग पैकेज का उपयोग करूँगा, अर्थात् ggplot2

library(ggplot2) 

df <- data.frame(
parameter=runif(300),
Time=1:300,
split=sample(c(1:4),300,replace=T),
split2=sample(c(1:2),300,replace=T)
)

ggplot(df, aes(Time, parameter, colour=as.factor(split2))) + 
geom_line() + 
facet_wrap(~split,nrow=4)

जो हमें एक चार्ट देता है जैसे:

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


1
मुझे ggplot में ग्रिड पसंद हैं, लेकिन क्या लाइट-ग्रे बैकग्राउंड को बंद करने का कोई तरीका है?
ब्लूपोल

1
+ opts(panel.background=theme_blank())
ब्रैंडन बर्टेल्सन

1
यदि आप अन्य परिवर्तन करना चाहते हैं, तो आप यह theme_get()देख सकते हैं कि आप क्या बदल सकते हैं। फिर मेरी पिछली टिप्पणी के समान पैटर्न का पालन करें, उन्हें सेट करें=theme_blank()
ब्रैंडन बर्टेल्सन

2
मैं खुद ggplot2 करने जा रहा था, लेकिन सोचा शायद जाली एक आसान कदम होगा। या तो इस तरह रेखांकन को स्टैक करने के लिए एक संरचित तरीका प्रदान करता है। बहुत सारे विवरणों को मोड़ना कठिन हो सकता है, लेकिन जल्दी से आकर्षक और पठनीय कुछ प्राप्त करना आसान है। (हालांकि आपको सही डेटा फ्रेम बनाने के लिए अपने सिर को चारों ओर लपेटना पड़ता है, जहां से डेटा को ग्राफ़ करने के बजाय, केवल ग्राफ़ में फेंकने के लिए।
वेन

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