xスケールは同じであるがRのyスケールが異なる2つのグラフを垂直に積み重ねるにはどうすればよいですか?


9

ご挨拶、

現在、私はRで次のことをしています:

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

summary.csvの一部:

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

最後の2行は必要な情報をプロットしており、結果は次のようになります。 代替テキスト 青い線は、関心のあるアーティファクトのバイト単位のエントロピーです。緑の線は、変化のエントロピーを表します。

さて、このグラフでは、スケールに大きな違いがないため、うまく機能します。しかし、緑の線が非常に小さくなって見えなくなる他のグラフがあります。

私が探していたソリューションには、次の2つのことが含まれていました。

  1. 緑の縦線を最初のグラフのすぐ下の2番目のグラフに移動するには、独自のy軸を使用し、x軸を共有します。
  2. 特定の値よりも「マグニチュード」に興味があるので、それを対数スケールで提供します。

前もって感謝します!

PS誰かが月を参照してxスケールに「マイナーティック」をどのように配置できるか教えてもらえれば幸いです:-)これらが1つの投稿に対して多すぎる質問である場合は、さらに分割できます。

回答:


15

を使用par(new=TRUE)して、2つの異なるy軸を使用して同じグラフにプロットできます。これで問題も解決します。

次に、同じプロットで2つのランダムな正規変数をプロットする簡単な例を示します。1つは平均0、もう1つは平均100(両方ともsd s = 1)です。1つ目は左のy軸に赤で、2つ目は右のy軸に青で表示されます。次に、軸ラベルが追加されます。

どうぞ:

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)

この場合、次のようになります(左軸が赤、右軸が青であることを忘れないでください)。 代替テキスト

更新:
コメントに基づいて、グラフの更新バージョンを作成しました。次にpar(mar=c(a,b,c,d))、グラフの周りに大きなマージンを作成するために(右軸ラベルに必要)、基本的なグラフ機能を少し掘り下げてmtext、軸ラベルとaxis関数の高度な使用法を示します。

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)

代替テキスト

ご覧のとおり、それは非常に簡単です。関数でを使用してデータの位置を定義ylimし、plot関数でを使用atして、表示axisする軸目盛りを選択できます。さらに、関数(ここでは右軸labelsで行いaxisます)を介して、軸目盛り(名目上のx軸に非常に役立ちます)のラベルを提供することもできます。軸ラベルを追加するにmtextat、垂直方向の配置(line水平方向の配置)にwith を使用します。

確認してください?plot?par?axis、および?mtext更なる情報のため。
グレートWebリソースは以下のとおりです。クイック-R :グラフの12、および3


それは興味深いですが、どのスケールがどの行に対応するかを読者にどのように伝えるのでしょうか。
Hugo Sereno Ferreira

このグラフを見てください:imgur.com/K8BCr.pngそこで、データに適用される場所(つまり、グラフ上部の左側の軸)に対応するデータとして、y軸のラベルと目盛りだけを表示します。グラフ下部の右軸は対応するデータとして)。さらに、異なる色(上記の例のように)と線種を使用し、キャプションで説明しました。左側の折れ線グラフと右側の軸の棒グラフを使用して、区別を明確にすることもできます。
Henrik

あなたが与えた例はとても良いです...どのようにして各軸を垂直方向にオフセットすることができましたか?
Hugo Sereno Ferreira、

2
本当に良い例です。グラフの唯一の問題は、両方のY変数名が重複していることです。この場合は、1つを左側に、もう1つを右側に配置します(たぶん垂直位置でも)。例を「本当に良い」から「完璧な」にアップグレードするには、Rのmtext関数を使用して変数名を作成します
Dave Kellen

@Hugo @Dave:両方のコメントの組み込みについては、私の更新を参照してください。
Henrik、

12

使いたいものが手に入ると思いますggplot2。以下のコードを使用して、以下を生成できます。

代替テキスト

明らかに、線の色のようなものは、あなたが望むものに変更することができます。X軸では、年に主線、月に副線を指定しました。

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

ええと、df = data.frame(t = days、values = c(data2、cum)、type = rep(c( "Bytes"、 "Changes")、each = 1001))を設定しようとしましたが、 rbind.zoo(...)のエラー:インデックスが重複しています
Hugo Sereno Ferreira、

これは、data2とcumが動物園オブジェクトだからです。生の値を取得するには、as.vector(data2)を使用します。また、1001の観測値があるため、1001を使用しました。別のものが必要になります。
csgillespie 2010

ここのNoob Rユーザー:data.frame(t =日、値= c(as.vector(data2)、as.vector(cum))のエラー:引数は異なる行数を意味します:1063、1300、2
Hugo Serenoフェレイラ

「days」、「data2」、「cum」と入力して、データを確認します。次に、「length(days)」などを確認します。時刻と値を一致させる必要があります。
csgillespie 2010
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.