ggplot2多层绘图上色与图层管理问题求助
解决ggplot2多层图形图层管理问题
以下是针对你遇到的四个问题的具体解决方案:
问题1:无法识别数据框存储的颜色
你把fill放在aes()里,导致ggplot将颜色值当作分类变量映射,而非直接使用颜色本身。只需把fill移出aes(),作为geom_rect的直接参数即可:
# 垂直色块图层修正 geom_rect( data = vparam.df, aes(xmin = xmin, xmax = xmax, ymin = ymin, ymax = ymax), inherit.aes = FALSE, fill = vparam.df$fill # 直接指定数据框中的颜色列 )
水平色块图层同理,将fill从aes()中移出,改为直接引用hparam.df$fill。
问题2:ggpattern全局应用相同图案
使用ggpattern的geom_rect_pattern,通过aes()映射pattern变量,再用scale_pattern_manual指定对应图案,实现分区域设置不同图案:
- 先给
hparam.df添加图案类型列:
hparam.df = data.frame( xmin = 0, xmax = 35, ymin = c(5, 10), ymax = c(10, 15), xlabel = rep(-1, 2), ylabel = c(7.5, 12.5), fill = c("#52be80", "#c0392b"), pattern = c("dot", "stripe"), # 添加图案类型标识 label = c("medium","strong") )
- 替换原水平
geom_rect为:
geom_rect_pattern( data = hparam.df, aes(xmin = xmin, xmax = xmax, ymin = ymin, ymax = ymax, pattern = pattern), inherit.aes = FALSE, fill = hparam.df$fill, alpha = 0.2, pattern_fill = "black", pattern_density = 0.1, pattern_spacing = 0.02 ) + scale_pattern_manual(values = c(dot = "circle", stripe = "stripe")) # 映射图案类型
问题3:十六进制透明度设置异常
不要用十六进制末尾加00的方式控制透明度,直接使用alpha参数即可,配合问题1的修改(fill移出aes()),就能正常生效。
问题4:geom_point无法识别wtype字段
你需要在geom_point的aes()里明确映射wtype字段,比如按类型设置点的颜色或形状:
geom_point(aes(color = wtype), size=1)
如果不需要区分样式,只是确保字段被识别,也可以显式声明映射,但通常用于视觉属性区分。
完整修正后的代码
library(ggplot2) library(ggpattern) vparam.df = data.frame( ymin = 0, ymax = 15, xmin = c(0, 7, 14, 21, 28), xmax = c(7, 14, 21, 28, 35), xlabel = c(3.5, 10.5, 17.5, 24.5, 31.5), ylabel = rep(-1,5), fill = c("#1e8449", "#52be80", "#f4d03f", "#f39c12","#c0392b"), label = c("low","mod. low","medium","pretty strong","strong") ) hparam.df = data.frame( xmin = 0, xmax = 35, ymin = c(5, 10), ymax = c(10, 15), xlabel = rep(-1, 2), ylabel = c(7.5, 12.5), fill = c("#52be80", "#c0392b"), pattern = c("dot", "stripe"), label = c("medium","strong") ) df = structure(list(xvar = c(13, 20, 16, 11, 21, 13, 13, 7, 9, 16, 11, 13, 15, 13, 22, 16), yvar = c(0, 2, 2, 4, 2, 4, 7, 5, 5, 0, 7, 2, 2, 7, 2, 7), wtype = c("Type4", "Type3", "Type4", "Type4", "Type1", "Type1", "Type4", "Type1", "Type1", "Type1", "Type3", "Type1", "Type2", "Type4", "Type2", "Type1")), row.names = c(NA, -16L), class = c("tbl_df", "tbl", "data.frame")) ggplot(df, aes(x=xvar, y=yvar )) + # 垂直色块层 geom_rect( data = vparam.df, aes(xmin = xmin, xmax = xmax, ymin = ymin, ymax = ymax), inherit.aes = FALSE, fill = vparam.df$fill ) + # 水平图案层 geom_rect_pattern( data = hparam.df, aes(xmin = xmin, xmax = xmax, ymin = ymin, ymax = ymax, pattern = pattern), inherit.aes = FALSE, fill = hparam.df$fill, alpha = 0.2, pattern_fill = "black", pattern_density = 0.1, pattern_spacing = 0.02 ) + scale_pattern_manual(values = c(dot = "circle", stripe = "stripe")) + # 数据点层,映射wtype geom_point(aes(color = wtype), size=1) + # 文本标签层 geom_text(data=vparam.df, aes(x=xlabel, y=ylabel, label=label), size=2) + geom_text(data=hparam.df, aes(x=xlabel, y=ylabel, label=label), size=2, angle=90) + # 修正坐标轴类型(原离散刻度不适合连续数值) scale_y_continuous(breaks = seq(0,15,5)) + scale_x_continuous(breaks = seq(0,35,7)) + # 主题设置 theme(legend.position = "none")
内容的提问来源于stack exchange,提问作者Nico
相关产品推荐
相关产品推荐

