如何在visreg与ggplot组合图中为点按连续变量设置渐变着色
解决方案
要实现保留Wind两个水平的拟合线,同时散点按Wind原始连续值呈现渐变色彩的效果,核心是避免同一美学属性(color)同时绑定离散和连续尺度的冲突。下面提供两种可行方法:
方法一:分离拟合线与散点的美学属性
利用visreg只绘制拟合线和置信区间,手动添加散点时使用fill美学(而非color),配合带填充的点形状规避尺度冲突:
# 1. 构建模型(以交互项模型为例) fit <- lm(Ozone ~ Solar.R * Wind, data = airquality) # 2. 用visreg生成仅含拟合线的基础图,关闭自带散点 base_plot <- visreg(fit, "Solar.R", "Wind", overlay = TRUE, breaks = 2, gg = TRUE, points = FALSE) # 关键参数:不绘制默认散点 # 3. 添加自定义散点并设置颜色尺度 base_plot + # 使用带边框的填充点(shape=21),fill映射连续Wind值 geom_point(data = airquality, aes(x = Solar.R, y = Ozone, fill = Wind), shape = 21, color = "black", size = 2) + # 设置拟合线的离散颜色 scale_color_manual(values = c("#90da90", "red3")) + # 设置散点填充的渐变颜色 scale_fill_gradient(low = "#90da90", high = "red3") + # 设置置信区间填充色,隐藏无关图例 scale_fill_manual(values = c("gray", "gray"), guide = "none") + theme_minimal()
方法二:提取visreg拟合数据手动绘图
直接提取visreg的拟合结果,完全用ggplot构建图层,更灵活控制各元素的颜色:
# 1. 构建模型 fit <- lm(Ozone ~ Solar.R * Wind, data = airquality) # 2. 提取visreg的拟合与置信区间数据(不直接绘图) vr_result <- visreg(fit, "Solar.R", "Wind", breaks = 2, plot = FALSE) # 3. 手动构建ggplot图层 ggplot() + # 添加散点,用连续Wind值映射color渐变 geom_point(data = airquality, aes(x = Solar.R, y = Ozone, color = Wind)) + # 添加第一组Wind水平的拟合线 geom_line(data = vr_result$fit[[1]], aes(x = Solar.R, y = visregFit), color = "#90da90", linewidth = 1) + # 添加第二组Wind水平的拟合线 geom_line(data = vr_result$fit[[2]], aes(x = Solar.R, y = visregFit), color = "red3", linewidth = 1) + # 添加第一组置信区间 geom_ribbon(data = vr_result$ci[[1]], aes(x = Solar.R, ymin = visregLwr, ymax = visregUpr), fill = "#90da90", alpha = 0.2) + # 添加第二组置信区间 geom_ribbon(data = vr_result$ci[[2]], aes(x = Solar.R, ymin = visregLwr, ymax = visregUpr), fill = "red3", alpha = 0.2) + # 设置散点的渐变颜色尺度 scale_color_gradient(low = "#90da90", high = "red3") + theme_minimal()
报错原因说明
你之前的代码报错是因为同时为color美学设置了两种冲突的尺度:scale_color_manual(对应离散的Wind分组)和scale_color_gradient(对应连续的Wind原始值)。ggplot中同一美学属性只能绑定一种尺度类型,因此会触发尺度不兼容的错误。
内容的提问来源于stack exchange,提问作者user224340
相关产品推荐
相关产品推荐

