我试图使用循环在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 :(得分:2)
我同意格雷戈尔。只需创建一个函数,循环或语句来构造基础数据,然后使用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()
答案 1 :(得分:0)
正如Gregor所说,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)