ggplot在for循环中运行仅显示单个图层问题咨询
问题原因
你遇到的是ggplot2惰性求值机制导致的问题:for循环里的xc、yc变量不会在每次迭代时立刻绑定到图层的美学参数里,只有当最后执行print(g)触发绘图时,才会读取这两个变量的当前值。此时循环已经执行完毕,xc和yc都固定为最后一次迭代的数值3,因此最终只会显示最右上角那一组圆环,看起来就像只生成了一个图层。
解决方法1:用lapply替代for循环
lapply每次迭代的变量会被封闭在当前函数环境中,不会被后续迭代覆盖,能保证参数绑定正确:
library(ggplot2) library(ggforce) arcs <- data.frame( radius = seq(from = 10, to = 100, by = 10) ) g <- ggplot(arcs) for(yc in 1:3) { g <- g + lapply(1:3, function(xc) { geom_arc_bar(aes(x0 = xc * 10, y0 = yc * 10, r0 = radius - 2, r = radius, start = 0, end = 2 * pi), fill = 'blue', alpha = 0.1, colour = NA) }) } g <- g + coord_equal() print(g)
解决方法2(更推荐):先整理数据再绘图
提前把所有圆心坐标和半径数据合并,不需要循环添加图层,逻辑更清晰、绘图性能也更好:
library(ggplot2) library(ggforce) library(tidyr) arcs <- data.frame( radius = seq(from = 10, to = 100, by = 10) ) # 生成所有圆心坐标组合 centers <- expand.grid(xc = 1:3, yc = 1:3) # 合并半径和坐标数据 plot_data <- crossing(arcs, centers) ggplot(plot_data) + geom_arc_bar(aes(x0 = xc * 10, y0 = yc * 10, r0 = radius - 2, r = radius, start = 0, end = 2 * pi), fill = 'blue', alpha = 0.1, colour = NA) + coord_equal()
内容的提问来源于stack exchange,提问作者Chris
相关产品推荐
相关产品推荐

