Aynı x ölçeğine, ancak R'de farklı bir y ölçeğine sahip iki grafiği dikey olarak nasıl yığınlayabilirim?


9

Selamlar,

Şu anda R'de aşağıdakileri yapıyorum:

require(zoo)
data <- read.csv(file="summary.csv",sep=",",head=TRUE)
cum  = zoo(data$dcomp, as.Date(data$date))
data = zoo(data$compressed, as.Date(data$date))
data <- aggregate(data, identity, tail, 1)
cum  <- aggregate(cum, identity, sum, 1)
days = seq(start(data), end(data), "day")
data2 = na.locf(merge(data, zoo(,days)))

plot(data2,xlab='',ylab='compressed bytes',col=rgb(0.18,0.34,0.55))
lines(cum,type="h",col=rgb(0,0.5,0))

Özet.csv alıntısı:

date,revision,file,lines,nclass,nattr,nrel,bytes,compressed,diff,dcomp
2007-07-25,16,model.xml,96,11,22,5,4035,991,0,0
2007-07-27,17,model.xml,115,16,26,6,4740,1056,53,777
2007-08-09,18,model.xml,106,16,26,7,4966,1136,47,761
2007-08-10,19,model.xml,106,16,26,7,4968,1150,4,202
2007-09-06,81,model.xml,111,16,26,7,5110,1167,13,258
...

Son iki satır ihtiyacım olan bilgiyi çiziyor ve sonuç aşağıdakine benziyor: alternatif metin Mavi çizgi ilgilendiğim eserin baytlarındaki entropidir. Yeşil çizgiler değişikliklerin entropisini temsil eder.

Şimdi, bu grafikte iyi çalışıyor çünkü ölçeklerde büyük bir fark yok. Ama yeşil çizgilerin o kadar küçük olduğu başka grafiklere bakamıyorum.

Aradığım çözüm iki şeyi içeriyordu:

  1. Yeşil dikey çizgileri, kendi y ekseni ancak paylaşılan x ekseni ile birincinin hemen altında ikinci bir grafiğe taşımak için.
  2. Logaritmik bir ölçek sağlamak için, belirli değerlerden daha fazla "büyüklük" ile ilgileniyorum.

Şimdiden teşekkürler!

PS Birisi bana aylar atıfta x ölçeğinde nasıl "küçük keneler" koyabilirsiniz söyleyebilir, ben takdir :-) Bunlar tek bir yazı için çok fazla soru varsa, ben daha fazla bölebilirsiniz.

Yanıtlar:


15

par(new=TRUE)İki farklı y ekseni kullanarak aynı grafiğe çizmek için kullanabilirsiniz ! Bu aynı zamanda probleminizi de çözmelidir.

Daha sonra, iki rastgele normal değişkeni, biri ortalama 0 diğeri ortalama 100 (her ikisi de sd s = 1) olan aynı grafikte çizen basit bir örnek bulacaksınız . Birincisi sol y ekseninde kırmızı, ikincisi sağ y ekseninde mavi. Ardından eksen etiketleri eklenir.

Hadi bakalım:

x <- 1:10
y1 <- rnorm(10)
y2 <- rnorm(10)+100

plot(x,y1,pch=0,type="b",col="red",yaxt="n",ylim=c(-8,2))
par(new=TRUE)
plot(x,y2,pch=1,type="b",col="blue",yaxt="n",ylim=c(98,105))

axis(side=2)
axis(side=4)

o zaman şöyle görünür (sol eksende kırmızı, sağ eksende mavi): alternatif metin

GÜNCELLEME:
Yorumlara dayanarak grafiğimin güncellenmiş bir versiyonunu ürettim. Şimdi par(mar=c(a,b,c,d)), grafik etrafında daha büyük bir kenar boşluğu oluşturmak için (sağ eksen etiketi için gerekli) mtextkullanarak eksen grafiklerini ve axisişlevin gelişmiş kullanımını kullanarak temel grafik işlevselliğini biraz daha derinlemesine inceliyorum :

x <- 1:100
y1 <- rnorm(100)
y2 <- rnorm(100)+100

par(mar=c(5,5,5,5))

plot(x,y1,pch=0,type="b",col="red",yaxt="n",ylim=c(-8,2),ylab="")
axis(side=2, at=c(-2,0,2))
mtext("red line", side = 2, line=2.5, at=0)

par(new=TRUE)
plot(x,y2,pch=1,type="b",col="blue",yaxt="n",ylim=c(98,108), ylab="")
axis(side=4, at=c(98,100,102), labels=c("98%","100%","102%"))
mtext("blue line", side=4, line=2.5, at=100)

alternatif metin

Gördüğünüz gibi oldukça basit. Sen ile verilerinizin konumunu tanımlayabilirsiniz ylimiçinde plot, sonra fonksiyonu kullanmak atiçinde axisgörmek istiyorum keneler hangi eksen seçmek için işlevi. Dahası, hatta yoluyla (nominal x ekseni için oldukça faydalıdır) eksen kene için etiket sağlayabilir labelsiçinde axis(sağ eksende burada yapılacak) işlevi. Eksen etiketlerini eklemek için kullanımı mtextile at(dikey konumlandırılması için lineyatay konumlandırılması için).

Emin kontrol etmek olun ?plot, ?par, ?axisve ?mtextdaha da bilgi için.
Harika web kaynakları şunlardır: Grafikler için Quick-R : 1 , 2 ve 3 .


Bu ilginç, ama okuyucuya hangi ölçeğin hangi çizgiye karşılık geldiğini nasıl söyleyebiliriz?
Hugo Sereno Ferreira

Bu grafiğe bir göz atın: imgur.com/K8BCr.png Burada, y ekseni etiketlerini ve kenelerini yalnızca verilere uygulandıkları yerde sunuyoruz (yani grafiğin üstündeki sol eksen için, karşılık gelen veriler olarak, ve grafiğin altındaki sağ eksen için, ilgili veri olarak). Ek olarak farklı renkler (yukarıdaki örnekte olduğu gibi) ve çizgi türleri kullandık ve resim yazısında açıkladık. Ayrımı daha net hale getirmek için solda çizgi grafik ve sağ eksende çubuk grafik de kullanabilirsiniz.
Henrik

Verdiğiniz örnek çok iyi ... Her ekseni dikey olarak dengelemeyi nasıl başardınız?
Hugo Sereno Ferreira

2
Gerçekten iyi bir örnek. Grafiğinizle ilgili tek sorun, her iki Y değişken adının çakışmasıdır. Bu durumda, biri solda ve diğeri sağda (muhtemelen dikey konumda bile) istersiniz. Örneğinizi "gerçekten iyi" den "mükemmel" e yükseltmek için, değişken adlarını yapmak için m'den mtext işlevini kullanmak isteyebilirsiniz
Dave Kellen

@Hugo @Dave: Her iki yorumun da dahil edilmesi için güncellememe bakın.
Henrik

12

Bence ne istersen onu alabilirsin ggplot2. Aşağıdaki kodu kullanarak, üretebilir:

alternatif metin

Açıkça, çizgi renkleri gibi şeyler istediğiniz gibi değiştirilebilir. X ekseni üzerinde yıllarda büyük, aylarda küçük çizgiler belirledim.

require(ggplot2)
t = as.Date(0:1000, origin="2008-01-01")  
y1 = rexp(1001)
y2 = cumsum(y1)
df = data.frame(t=t, values=c(y2,y1), type=rep(c("Bytes", "Changes"), each=1001))

g = ggplot(data=df, aes(x=t, y=values)) +
  geom_line() +
  facet_grid(type ~ ., scales="free") +
  scale_y_continuous(trans="log10") +
  scale_x_date(major="years", minor="months") +
  ylab("Log values")
g

Uh, df = data.frame (t = gün, değerler = c (data2, cum), type = rep (c ("Bayt", "Değişiklikler"), her biri = 1001) ayarlamayı denedim, ancak bir Rbind.zoo hatası (...): dizinler çakışıyor
Hugo Sereno Ferreira

Çünkü data2 ve cum hayvanat bahçesi objeleridir. Ham değerleri almak için as.vector (data2) kullanın. Ayrıca 1001 kullandım çünkü 1001 gözlemim vardı. Farklı bir şeye ihtiyacınız olacak.
csgillespie

Noob R kullanıcısı burada: data.frame hatası (t = gün, değerler = c (as.vector (data2), as.vector (cum)),: argümanlar farklı sayıda satır anlamına geliyor: 1063, 1300, 2
Hugo Sereno Ferreira

Verilerinize bakmak için "günler", "veri2" ve "cum" yazın. Sonra "uzunluk (gün)", vb. Bakın. Zaman noktalarını değerlerle eşleştirmeniz gerekir.
csgillespie
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.