2016-11-07 9 views
2

顧客のために、2つのy軸を持つ結合バープロットとラインプロット(ポイント付き)を実行しようとしています。 問題:バーとポイントが整列していません。R - 2つのy軸、棒と点が並んでいないプロット

背景:いくつかのマシンがあり、スイッチのオン数と各マシンが実行されている時間を測定しています。複数のマシンがあるので、スペースを節約するために、両方の情報を1つのプロットにまとめてください。

データは、曜日または時間で集計されます。ここで

date <- seq(as.Date("2016-10-01"), as.Date("2016-10-10"), "day") 
counts <- c(390, 377, 444, NA, NA, NA, NA, 162, 166, 145) 
runtime <- c(56.8, 59.4, 51.0, NA, NA, NA, NA, 38.5, 40.9, 43.4) 
df <- data.frame(date = date, counts = counts, runtime = runtime) 

私がこれまで試したものです::ここではいくつかのサンプルデータです

par(mar = c(3,4,4,4) + 0.3)  
barplot(df$runtime, col = "palegreen2", border = "NA", ylab = "runtime in [%]", 
    ylim = c(0,100), font.lab = 2) 
par(new = TRUE) 
ymax <- max(df$counts, na.rm = TRUE) * 1.05 
plot(df$date, df$counts, type = "n", xlab = "", ylab = "", yaxt = "n", 
    main = "Machine 1", ylim = c(0, ymax)) 
abline(v = date, col = "red", lwd = 2.5) 
lines(df$date, df$counts, col = "blue", lwd = 2) 
points(df$date, df$counts, pch = 19, cex = 1.5) 
axis(4) 
mtext("Number of switching operations", side = 4, line = 3, font = 2) 

enter image description here

私はここに2つの軸のいくつかのインスピレーションを見つけた:私はために何ができるかhttp://robjhyndman.com/hyndsight/r-graph-with-two-y-axes/

ラインプロットのポイントに合わせて真ん中のバーを取得しますか?

+0

申し訳ありませんが、私は写真と何か間違ったものを作って、最初に "こんにちは"を失ったようです: – Suti

+1

This [SO post](http://stackoverflow.com/questions/18634431/r-in-barplot-中点が中心でないwrt-bar)が正しい方向に向けるかもしれません。 – emilliman5

+0

その面白いリンクをありがとう。私はオブジェクトとしてboxplotを安全にしようとし、ライン/ポイントプロットの値を使用しました。それはうまくいくようです。しかし、日付や日付/時刻のフォーマットをx軸に保持するにはどうしたらいいですか? – Suti

答えて

1

実行中の問題は、バープロット後の2番目のplot関数の呼び出しです。これは、後続の点のシフトを引き起こしている描画キャンバスをシフト/サイズ変更しています。

ここでは、ポイントとラインをバープロットに再スケーリングするだけの簡単な方法があります。

ymax <- max(df$counts, na.rm = TRUE) * 1.05 

par(mar=c(4.1,5.1,2.1,5.1)) 
bp <- barplot(df$runtime, col = "palegreen2", border = "NA", ylab = "runtime in [%]", 
       ylim = c(0,100), font.lab = 2, xlim=c(0.2,12),) 

barplot(df$runtime, col = "palegreen2", ylab = "runtime in [%]", border="NA", 
    ylim = c(0,100), font.lab = 2) 

abline(v = bp, col = "red", lwd = 2.5) 
lines(bp, df$counts/ymax*100, col = "blue", lwd = 2) 
points(bp, df$counts/ymax*100, pch = 19, cex = 1.5) 
axis(4,at=c(0,20,40,60,80,100), labels=c("0","100","200","300","400","500")) 
mtext("Number of switching operations", side = 4, line = 3, font = 2) 
axis(1, at=bp, labels=df$date) 

enter image description here

0

@emilliman:あなたの忍耐と入力いただき、ありがとうございます!あなたのプロットは完全には正しくありません。なぜなら、2番目のy軸のスケーリングはポイントの値に合っていないからです。しかし、私の考えは解決策を見つけるのに役立ちました!

library(plyr) 
ymax <- max(df$counts, na.rm = TRUE) 
ymax_up <- round_any(ymax, 100, f = ceiling) 
ylab <- ymax_up/5 * c(0:5) 

par(mar = c(3,4,4,4) + 0.3) 
bp <- barplot(df$runtime, col = "palegreen2", border = "NA", ylab = "runtime in [%]", 
    ylim = c(0,100), font.lab = 2, main = "Machine 1") 
abline(v = bp, col = "red", lwd = 2.5) 
lines(bp, 100/ymax_up * df$counts, col = "blue", lwd = 2) 
points(bp, 100/ymax_up * df$counts, pch = 19, cex = 1.5) 

axis(4,at=c(0,20,40,60,80,100), labels= as.character(ylab)) 
mtext("Number of switching operations", side = 4, line = 3, font = 2) 
xlab <- as.character(df$date, format = "%b %d") 
axis(1, at=bp, labels = xlab) 
abline(h = c(0,100)) 

http://i.imgur.com/9YtYGSD.png

多分これがこの問題に遭遇他人のために有用である:

は、ここに私の新しいコードです。

関連する問題