如何在R ggplot中为两组线条设置不同调色板?
解决ggplot中原始折线与loess平滑线配色重叠的问题
报错原因
你直接在geom_smooth()的aes()中传入长度为2的颜色向量,但数据集有62行数据。ggplot要求美学映射的向量长度要么为1,要么与数据行数完全一致,因此触发报错。
解决方案
方案一:给平滑线设置统一固定颜色
最简单的方式是让所有平滑线使用同一种对比色(比如黑色),原始折线保留分组配色,通过颜色差异区分两类线条:
data %>% ggplot(aes(x = as.Date(Date), y = value, color = temp)) + geom_line(linewidth = 0.1) + # 直接设置color参数(不放在aes()内),所有平滑线用黑色 geom_smooth(method = 'loess', span = 0.2, color = "black", linewidth = 0.8) + theme_classic()
方案二:自定义调色板+调整线条样式
如果希望分组的折线与平滑线颜色对应,但通过线条粗细、透明度区分,可使用scale_color_manual()自定义分组颜色,同时调平滑线的线条宽度:
data %>% ggplot(aes(x = as.Date(Date), y = value, color = temp)) + geom_line(linewidth = 0.1, alpha = 0.6) + geom_smooth(method = 'loess', span = 0.2, linewidth = 1) + # 自定义对比强烈的分组配色 scale_color_manual(values = c("最高气温" = "#2c3e50", "最低气温" = "#e74c3c")) + theme_classic()
这里将折线设为半透明,平滑线加粗,即使颜色对应也能清晰区分。
方案三:给折线与平滑线分配不同配色组
如果需要折线与平滑线使用完全不同的配色,可拆分美学映射:
data %>% ggplot(aes(x = as.Date(Date), y = value)) + # 原始折线用color映射分组 geom_line(aes(color = temp), linewidth = 0.1) + # 平滑线按分组拟合,使用独立的颜色标识 geom_smooth(aes(group = temp, color = paste0(temp, "_smooth")), method = 'loess', span = 0.2, linewidth = 0.8) + # 自定义所有元素的颜色 scale_color_manual(values = c( "最高气温" = "#3498db", "最低气温" = "#9b59b6", "最高气温_smooth" = "#2980b9", "最低气温_smooth" = "#8e44ad" )) + # 可选:调整图例样式,匹配线条粗细 guides(color = guide_legend(override.aes = list( linewidth = c(0.1, 0.1, 0.8, 0.8) ))) + theme_classic()
内容的提问来源于stack exchange,提问作者doraemon
相关产品推荐
相关产品推荐

