如何在ggplot中优化线条区分度以适配视障用户?
优化时间序列图表辨识度的解决方案
针对色盲及视野盲区人群的需求,我们可以通过多重差异化特征组合来提升图表可读性,核心优化点和修改后的代码如下:
关键优化措施
- 给每个数据系列分配独特的标记形状(如圆形、三角形、方形),弥补线条样式相似的问题
- 使用色盲友好型配色方案,避免红绿等高对比度但色盲难区分的颜色组合
- 同时结合线条样式、颜色、标记三种特征,让每个系列具备独有的识别点
- 加粗实际数据的线条,突出核心观测值,和预测模型区分开
- 统一图例,把所有系列整合到同一区域,减少视觉分散
修改后的完整代码
library(feasts) library(fable) library(ggplot2) library(tsibble) library(dplyr) tmp <- data.frame( Month = c(1,2,3,4,5,6,7,8,9,10), StateX = c(1527,1297,933,832,701,488,424,353,302,280) ) %>% as_tsibble(index = Month) tmpNext4 <- data.frame( Month = c(11,12,13,14), StateX = c(211,182,153,125) ) %>% as_tsibble(index = Month) # Fit the models to tmp dataframe: fit <- tmp %>% model( Mean = MEAN(StateX), `Naïve` = NAIVE(StateX), Drift = NAIVE(StateX ~ drift()) ) # Produce forecasts for the next 4 months: fcTmp <- fit %>% forecast(new_data = tmpNext4) # 整合实际数据与预测数据,方便统一绘图 actual_data <- bind_rows( tmp %>% mutate(.model = "Actual", value = StateX), tmpNext4 %>% mutate(.model = "Actual", value = StateX) ) forecast_data <- fcTmp %>% mutate(value = .mean) # 合并所有数据 all_data <- bind_rows(actual_data, forecast_data) # Plot the forecasts with enhanced accessibility: all_data %>% ggplot(aes(Month, value)) + # 绘制线条:每个系列对应独特颜色、线型,实际数据加粗 geom_line(aes(color = .model, linetype = .model, group = .model), linewidth = ifelse(all_data$.model == "Actual", 1.2, 0.8)) + # 绘制标记点:每个系列对应独特形状 geom_point(aes(color = .model, shape = .model, group = .model), size = 2.5) + # 色盲友好配色 scale_color_viridis_d(option = "plasma") + # 自定义标记形状 scale_shape_manual(values = c("Actual" = 16, "Mean" = 17, "Naïve" = 15, "Drift" = 18)) + # 自定义线型 scale_linetype_manual(values = c("Actual" = "solid", "Mean" = "dashed", "Naïve" = "dotted", "Drift" = "dotdash")) + labs(title = "StateX 时间序列预测", x = "月份", y = "StateX 值") + theme_minimal()
代码说明
- 数据整合:把实际数据(历史+未来观测)和预测数据合并成一个数据集,方便统一映射美学特征,避免多次调用
geom_line导致图例分散 - 多重差异化映射:每个
.model系列同时绑定color、linetype、shape,三重特征确保即使某一种特征难以区分,还有其他特征辅助识别 - 色盲友好配色:
scale_color_viridis_d()提供的配色经过色盲测试,能被绝大多数色盲人群清晰区分 - 线条粗细区分:实际数据线条加粗,预测模型线条稍细,突出核心观测数据
- 自定义标记与线型:手动指定每个系列的标记形状和线型,确保差异足够明显
内容的提问来源于stack exchange,提问作者Village.Idyot
相关产品推荐
相关产品推荐

