You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在降水与积雪滑动距离时序图中加入二分类降水类型标识

解决方案

以下提供2种可直接兼容现有图表的实现方案,以及1种更符合数据特征的优化可视化思路:

方案1:降水量线添加分类标记

直接在降水量折线的对应数据点上叠加形状标记区分降水类型,可自主选择是否标记全部分类还是仅标记降雨:

代码修改说明

  1. 先将二分类变量转为带标签的因子,方便图例展示
  2. 新增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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.06 07:27:03