R'de bir grafik üzerinde birden fazla çizim çizilsin mi?


13

Aşağıdaki kodu kullanarak, bir grafikte dört parsel çizmeye çalıştım R. Figürden memnun değilim çünkü parseller arasında çok fazla boşluk var, bu nedenle parsellerin genişliği parselleri analiz etmek için yeterli değil.

  1. Birisi dört parsel içeren güzel bir grafik üretmeme yardımcı olabilir mi?

  2. X ekseni etiketlerini varsayılan 5 etiket yerine 1'den 10'a nasıl saklayabilirim?

Veri:

a1: 11.013 13.814 13.831 13.714 13.787 13.734 13.778 13.771 13.823 13.659

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

B1, c1 ve d1 için a1 verileri kullandım; b2, c2 ve d2 için a2 verileri burada.

Şekil:

resim açıklamasını buraya girin

Kod:

        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
pls verilerinizin ayrıntılarını verebilir misiniz? muhtemelen, dput (data_from_r)
suncoolsu

@ suncoolsu, soruyu bir örnek veri ile güncelledim. Teşekkür ederim.
samarasa

Bir efsane ile aynı eksende 2 renk ve 4 çizgi türünüz olsaydı ne olurdu? Kodunu ve sonuçlarını görmek istiyorum.
Paul

user87: 4 çizim 4 farklı deneyden beri. Bu nedenle, deneylerin sonuçlarını analiz etmek için 4 parsel çizmenin daha iyi olduğunu düşünüyorum.
samarasa

@ user87, ne demek istediğinden emin değilim. Belki yeni bir soru başlattıysanız biri cevaplardı (ben :))
Brandon Bertelsen

Yanıtlar:


16

Kullandığınız yöntem gibi bir şeye bağlı kalmak istiyorsanız, layout () komutunu öğrenmek isteyebilirsiniz. Birkaç ayrıntı daha değişir ve grafikleri birbirine daha yakınlaştırabilirsiniz. Ayrıca, grafikler arasında değişen benzersiz şeyleri bir listeye (veriler ve kenar boşlukları gibi) koyabilir ve ardından bir döngüden geçebilirsiniz. Ayrıca, öğelerin nereye gittiğini kontrol edebilmeniz için alt ekseni direct axis () komutuyla yaptığımı not edeceksiniz.

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)

theplot

Bunu yapabildiğim kadar güzel yapmaya gayret etmedim ve ilk kukla grafiği yapmak yerine ilk karede yeterli alan ayarlayabilirdim. Ne yazık ki mar () ayarı çerçeveyi doldurmaya çalışın ve üst kenar boşluğu grafiğin üzerindeki etiketin uzak olduğu mesafeyi etkiler, bu yüzden tüm etiketlerimi sadece kullanmak yerine mtext () veya text () ile yapmak zorunda kalırdım ana ayar içinde arsa ve bunu yapmak gibi hissetmedim


ikinci olarak, temel grafik için +1. Boşuna layout () komutu ile güzel bir şeyler yazmak için denedim. Bir dahaki sefere kullanmam gerektiğinde buraya geleceğim.
Chris Beeley

13

Kafes grafik paketini öğrenmenizi tavsiye ederim. Birkaç çizgiyle istediğin şeye yaklaşabilirim. İlk olarak, verilerinizi aşağıdaki gibi bir veri çerçevesinde paketleyin:

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

hangi verir:

    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

Sonra kafes kullanın 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")

ki böyle güzel bir grafik verir:

resim açıklamasını buraya girin

DÜZENLE:

Farklı sembollere ve çizgilere sahip olmak ve efsanenizde görünmesini istiyorsanız, karmaşıklaşır, çünkü efsaneyi tam anlamıyla kendiniz inşa edersiniz ve bunları kendiniz geçersiz kılmadıysanız varsayılan kafes renklerini nasıl alacağınızı bilmeniz gerekir. :

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

resim açıklamasını buraya girin

DÜZENLEME 2:

İki kategori gerçekten "X" ve "Y" kadar basitse, kodu ve grafiği basitleştirebilirsiniz:

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

nokta sembolü olarak "X" ve "Y" kullanır. Bir efsaneye ihtiyacınız yoktur ve daha sonra grafiklerin kendilerine daha fazla alan ayırabilirsiniz. (Öte yandan, görünümü beğenmeyebilir veya noktanın tam merkezini belirlemek daha zor olabilir, ancak bu, her noktadan geçtiği için olabileceği kadar sorun değildir.)

DÜZENLEME 3:

Aslında, strip=F, strip.left=T,grafiklerin soluna A, B, C, D etiketlerini koymak için grafiğe eklemelisiniz , bu da size böyle uzun bir grafikte daha fazla yer sağlar:

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

resim açıklamasını buraya girin


@Wayne: space = "top", pch = c (1,2), lty = c (2,4) bağımsız değişkenleri ile auto.key kullanarak grafiğin üstünde bir efsane tutmaya çalışıyorum, ancak pch değerleri ve lty değerleri çalışmıyor. Dahası, X ve Y'yi efsanede yatay olarak tutmak istiyorum. Bunun için bana yardım eder misin?
samarasa

Evet. Bir kağıtta X ve Y'yi ayırmak için farklı pch değerleri kullanmam gerekiyor. Ben xyplot için pch (1,4) bağımsız değişkenini ekleyerek çizimde farklı pch değerleri kullanabilirim, ancak efsaneye yansımıyor. Lütfen açıklamada X ve Y için farklı pch değerlerini nasıl kullanabileceğimi bildirin.
samarasa

Tamam, eve geldiğimde ve kitaba danıştıktan sonra anladım. Düzenlenen sürüme göz atın.
Wayne

Sorun değil. Sanırım EDIT 3, orijinalinize benzeyen (ancak daha iyi görünen ve daha fazla grafik alanı olan) en iyi grafiği veriyor. Ben oldukça basit olduğunu düşünüyorum efsaneyi hareket etmedi. Çizginin efsanedeki noktadan geçmesini istiyorsanız, bir sonraki karmaşıklık düzeyine götürmeniz ve özel grobs oluşturan draw.key şeyler yapmanız gerektiğini düşünüyorum (bir gridşey: kafes ve ggplot2 ızgara üzerinde inşa) .
Wayne

Evet, şimdi grafik daha iyi. Ancak, normal çizim fonksiyonuyla elde ettiğimiz gibi, efsanedeki çizgiyi aşarsak gerçekten iyi olur.
samarasa

9

@ Brandon'ın ggplot2çözümünün istenen efsane davranışını içeren bir versiyonu :

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

resim açıklamasını buraya girin

Efsaneleri çok daha kolay buluyorum ggplot2, ama YMMV.

DÜZENLE

Yorumlarda birkaç soruya değinmek. Özellikle nokta veya çizgi türlerini belirtmek için, kullanmak istiyorsunuz scale_aesthetic_manualnerede aestheticya olduğu shape, linetypeÖrneğin vb:

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

Çeşitli eksen etiketlerinin boyutunun değiştirilmesi, genellikle, kullanılarak temadaki ayarları değiştirerek yapılır opts(). Örneğin:

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

Daha fazla bilgi için web sitesine ve kitabına dalmanız gerekir .


2
Sık sık ggplot2'yi tercih ederim. Aslında, kafes çok karmaşık hale geldiğinde ggplot2 ile hızlı bir şekilde denedim ve şekilleri ve çizgi stillerini açıkça seçmek istersem, efsanenin nokta / çizgi stillerini düzgün bir şekilde yansıtmasını sağlayamadım. Muhtemelen yanlış şekilde yaptım ve grafikte çalışmayı başardı, ancak ggplot'un efsane yaratımını kandırdı. İşinize yarayıp yaramadığını görebiliyor musunuz ve kodu gönderiyor musunuz?
Wayne

@Joran: Çizgi tiplerini, nokta tiplerini ve renkleri değiştirmeye çalıştım, ancak başarılı olamadım. Linetipleri nasıl değiştirebileceğimizi bize bildirir misiniz? Ve ayrıca lütfen x ve y laboratuvarlarının boyutunu nasıl artırabileceğimizi bize bildirin.
samarasa

Şu anda telefonumdayım; @Brandon aradığınız şeyle eve dönmeden önce cevabını düzenlemezse, bu gece daha sonra cevaplayacağım.
joran

8

Wayne'in cevabına benzer şekilde, farklı bir paket de kullanacağım, yani 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)

Bu bize şöyle bir grafik verir:

resim açıklamasını buraya girin


1
Ggplot'taki ızgaraları seviyorum, ancak açık gri arka planı kapatmanın bir yolu var mı?
bluepole

1
+ opts(panel.background=theme_blank())
Brandon Bertelsen

1
Başka değişiklikler yapmak isterseniz, theme_get()neleri değiştirebileceğinizi görmek için yazabilirsiniz . Sonra son =theme_blank()
yorumumla

2
Ben kendim ggplot2 yapacaktım, ama belki kafes daha kolay bir adım olacağını düşündüm. Her ikisi de böyle grafikleri istiflemek için yapılandırılmış bir yol sağlar. Birçok ayrıntıyı değiştirmek zorlaşabilir, ancak hızlı ve çekici bir şey elde etmek kolaydır. (Gerçi, sadece grafiğe bir şeyler atmak yerine, verilerin grafiğe alınacağı doğru veri çerçevesini oluşturmak için başınızı sarmanız gerekir.
Wayne

Hadley'nin, verileri doğru şekle masaj yapmak için diğer paketlerinde veri işleme araçları sağladığını gördüm. Şüphe melt()
duyduğunuzda
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.