【问题标题】:ggplot2: plotting several boxes using a loopggplot2:使用循环绘制多个框
【发布时间】:2017-01-25 20:28:26
【问题描述】:

我正在尝试使用循环在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)

这段代码只绘制了最终的矩形,但我不知道我做错了什么。循环运行正常,因为我包含了一个打印语句来检查。有人可以指出我的错误并提供解决方案吗?

【问题讨论】:

  • ggplot 是为绘制数据而设计的。我建议您构建一个数据框(如果您愿意,可以在类似的循环中)然后绘制它。照原样,您正在尝试将螺丝刀用作锤子。
  • 好的,明白了。感谢您的帮助。不过出于好奇:为什么代码会失败?
  • 我不确定。我的ggplot 是围绕数据框设计的。你几乎肯定不应该在没有数据框的情况下使用aes(),但即使没有数据框,你的代码也不起作用。 for 循环与它无关 - 如果您手动写出前几次迭代,第一层按预期工作,而第二层则没有。

标签: r loops ggplot2


【解决方案1】:

我同意格雷戈尔的观点。只需创建一个函数、循环或语句来构造基础数据,然后用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()

【讨论】:

    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-11-04
      • 1970-01-01
      • 2016-01-02
      • 1970-01-01
      • 2021-05-25
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多