2017-01-25 26 views
0

ループを使用してggplot2に一連のボックスを描画しようとしています。以下、私はおもちゃの例を含んでいます。ggplot2:ループを使用して複数のボックスをプロットする

# Load necessary library 
library(ggplot2) 

# Height of rectangle 
box.size <- 0.5 

# Colours for rectangles 
my.cols <- c("red", "blue", "purple", "yellow", "green") 

# Initialise plot & set limits 
p <- ggplot() + xlim(0, 1) + ylim(0, 2.5) 

# Loop through and draw boxes 
for(i in 1:5){ 
    # Draw boxes 
    p <- p + geom_rect(aes(xmin = 0, xmax = 1, ymin = (i - 1) * box.size, ymax = i * box.size), 
       fill = my.cols[i]) 

    # Check that the loop is working 
    print(i) 
} 

# Plot graph 
print(p) 

このコードは、最終的な四角形をプロットし、私は私が間違っているのかを把握することはできません。確認するprintステートメントが含まれているので、ループが正しく実行されています。誰かが私のエラーを指摘して解決策を提示できますか?

+0

'ggplot'は* data *をプロットするために設計されています。あなたが望むならば、同様のループでデータフレームを構築し、それをプロットすることをお勧めします。つまり、ドライバーをハンマーとして使用しようとしています。 – Gregor

+0

さて、分かりました。役に立った返信ありがとう。しかし、好奇心から:コードはなぜ失敗するのですか? – Lyngbakr

+0

私は正確にはわかりません。私の 'ggplot'はデータフレームの周りに強く設計されています。ほとんどの場合、データフレームなしで 'aes()'を使うべきではありませんが、それがなくてもコードは機能しません。 'for'ループはそれとは何の関係もありません。最初の2つの繰り返しを手作業で書くと、最初のレイヤーは期待通りに動作し、2番目のレイヤーは動作しません。 – Gregor

答えて

2

私はGregorに同意します。関数、ループ、または文を作成して基底のデータを作成してから、ggplot2とプロットしてください。

library(ggplot2) 

box.size <- 0.5 

df <- data.frame(xmin = rep(0, 5), 
      xmax = rep(1,5), 
      ymin = (seq(1:5)-1) * box.size, 
      ymax = seq(1:5) * box.size, 
      fill = c("red", "blue", "purple", "yellow", "green")) 

ggplot(df) + 
    geom_rect(aes(xmin = xmin, xmax = xmax, ymin = ymin, ymax = ymax, fill = fill)) + 
    scale_fill_identity() 

enter image description here

0

グレによって示されるように、ggplotはループで使用することを意味するものではありません。座標をデータフレームに最初に設定する必要があります:

library(dplyr) 
library(ggplot2) 
mydf <- data.frame(my.cols, tmp = rep(box.size, 5), i = 1:5) 
mydf <- mutate(mydf, ymin = (i - 1) * tmp, ymax = tmp * i) 
mydf <- select(mydf, -tmp, -i) 

ggplot(mydf) + xlim(0,1) + ylim(0, 2.5) + geom_rect(aes(xmin = 0, xmax = 1, ymin = ymin, ymax = ymax), fill = my.cols) 
関連する問題