如何在ggplot2的geom_line中让指定线条颜色突出覆盖其他线条
问题根源
ggplot2默认按照cntry的因子水平顺序从上到下逐层绘制折线,你需要突出的法国是因子的第一个水平,会最先被绘制,后续其他国家的灰色折线会覆盖在蓝色线条上方,所以达不到突出效果。
另外你原代码中color=cntry写在了aes()的外部,属于全局静态参数而非映射参数,也会导致颜色映射不符合预期。
解决方案
推荐两种实现方式,按需选择即可:
方式1:分层绘制(更直观不易出错)
先统一绘制所有非目标国家的灰色折线,再单独绘制需要突出的法国折线,自然会叠在所有灰色线条的上方:
library(ggplot2) ggplot() + # 绘制背景灰色折线 geom_line(data = df[df$cntry != "France", ], aes(x = year, y = unemp, group = cntry), color = "#999999", size = 1.5) + # 绘制前景突出的蓝色折线 geom_line(data = df[df$cntry == "France", ], aes(x = year, y = unemp), color = "darkblue", size = 1.8)
这里把蓝色线条的size调大为1.8,可以进一步强化突出效果,也可以根据需要调整为2,或加alpha=0.9参数避免完全遮挡下方重合的线条。
方式2:调整因子顺序(保留统一映射逻辑,适合需要图例的场景)
将需要突出的法国调整到因子水平的最后一位,保证它最后被绘制,配合命名式的颜色映射避免顺序错位:
library(ggplot2) # 调整因子顺序,法国放所有水平的最后一位 df$cntry <- factor(df$cntry, levels = c(setdiff(levels(df$cntry), "France"), "France")) ggplot(df, aes(x = year, y = unemp, group = cntry, color = cntry)) + geom_line(size = 1.5) + # 命名式指定颜色,不受因子顺序影响 scale_color_manual(values = c("France" = "darkblue", .default = "#999999"))
注:.default参数需要ggplot2 3.3.0及以上版本支持,如果版本较低可以手动补全其他国家的灰色值:values = c("France" = "darkblue", "Germany" = "#999999", "Italy" = "#999999", "Poland" = "#999999", "Spain" = "#999999", "United Kingdom" = "#999999")
内容的提问来源于stack exchange,提问作者Jack
相关产品推荐
相关产品推荐

