如何在降水与积雪滑动距离时序图中加入二分类降水类型标识
解决方案
以下提供2种可直接兼容现有图表的实现方案,以及1种更符合数据特征的优化可视化思路:
方案1:降水量线添加分类标记
直接在降水量折线的对应数据点上叠加形状标记区分降水类型,可自主选择是否标记全部分类还是仅标记降雨:
代码修改说明
- 先将二分类变量转为带标签的因子,方便图例展示
- 新增
geom_point层,将降水类型映射为点的形状/颜色,过滤NA值避免报错
完整代码
library(ggplot2) library(scales) library(patchwork) library(dplyr) #### 数据预处理 date <- as.Date(c('2010-11-1','2010-11-2','2010-11-3','2010-11-4','2010-11-5','2010-11-6','2010-11-7','2010-11-8','2010-11-9','2010-11-10')) distance <- c(5,4,4,7,9,7,NA,5,6,4) precipitation <- c(11,15,NA,0,3,0,2,2,9,10) dicht <- c(1,1,NA,0,1,0,1,0,0,1) df <- data.frame(date, distance, precipitation, dicht) # 转换为因子方便图例展示 df$dicht_fac <- factor(df$dicht, levels = c(0,1), labels = c("降雪/无降水", "降雨")) #### 基础设置 Sys.setlocale(category = "LC_ALL", locale = "english") startTime <- as.Date("2010-11-01") endTime <- as.Date("2010-11-10") start_end <- c(startTime,endTime) scale <- max(df$distance, na.rm = T) / max(df$precipitation, na.rm = T) #### 绘图(带点标记版本) ggplot()+ geom_line(data = df, aes(x = date, y = distance, color = "积雪平均日滑动距离"),na.rm= TRUE, size = 1)+ geom_line(data = df, aes(x = date, y = precipitation*scale ,color = "日降水量"),na.rm = TRUE, size = 1) + # 新增点标记层,映射降水类型为形状,可调整size控制大小 geom_point(data = df %>% filter(!is.na(dicht_fac)), aes(x = date, y = precipitation*scale, shape = dicht_fac), size = 3, fill = "red", na.rm = T) + # 若仅需要标记降雨,替换为下面这行即可 # geom_point(data = df %>% filter(dicht == 1), # aes(x = date, y = precipitation*scale), # shape = 8, size = 3, color = "red", na.rm = T) + ggtitle("日降水量与积雪平均滑动距离") + labs(color = "", shape = "降水类型")+ xlab("2010年")+ ylab("累积滑动距离 [mm]")+ scale_x_date(limits=start_end,breaks=date_breaks("1 day"),labels=date_format("%m月%d日"))+ scale_y_continuous(sec.axis = sec_axis(~./scale,name = "日降水量"),limits = c(0, 15))+ scale_color_manual("", guide = "legend", values = c("积雪平均日滑动距离"= "darkorange2", "日降水量" = "black"))+ theme(legend.position="bottom", axis.text.x = element_text(angle = 50, size = 10 , vjust = 0.5), axis.text.y = element_text(size = 10, vjust = 0.5), panel.background = element_rect(fill = "gray100"), plot.background = element_rect(fill = "gray100"), panel.grid.major = element_line(colour = "lightblue"), plot.margin = unit(c(1, 1, 1, 1), "cm"), plot.title = element_text(hjust = 0.5, size = 22))
方案2:背景高亮标记降雨时段
如果担心点标记造成图面拥挤,可以选择用半透明背景色块高亮所有降雨日期,不会遮挡原有折线信息:
代码修改点
在ggplot中新增如下图层即可:
geom_rect(data = df %>% filter(dicht == 1), aes(xmin = date - 0.4, xmax = date + 0.4, ymin = -Inf, ymax = Inf), fill = "lightblue", alpha = 0.2, inherit.aes = F)
优化思路:降水量改用分类填充柱状图
日降水量属于日度离散指标,用柱状图比折线图的表现形式更合理,可直接将柱子的填充色映射为降水类型,信息层级更清晰:
核心修改点
把原有的降水量折线替换为geom_col层,映射fill = dicht_fac即可,无需额外添加标记,读者可直接通过柱子颜色判断降水类型。
内容的提问来源于stack exchange,提问作者Zorin Ivanov
相关产品推荐
相关产品推荐

