如何绘制无缺失日期中断的跨年度1月降水时间序列图?
绘制多年1月降水连续时间序列图的解决方案
R语言解决方案
优化ggplot2代码实现连续折线
问题核心是真实日期轴会在每年1月之间产生11个月的间隔,导致折线断开。只需将日期转换为当年1月的相对天数,就能让所有年份的1月数据在连续的x轴上排列:
library(ggplot2) library(lubridate) library(reshape2) # 处理数据,提取1月的相对天数 dfmelt <- melt(JAN, id.vars = "DATE") dfmelt$day_of_jan <- yday(dfmelt$DATE) # 1月1日为1,1月31日为31 # 绘制连续折线图 ggplot(dfmelt, aes(x = day_of_jan, y = value, color = variable, group = year(DATE))) + geom_line() + labs(title = "多年1月降水时间序列", x = "1月日期(日)", y = "降水量") + scale_x_continuous(breaks = seq(1, 31, 5))
如果需要区分年份,可通过hue参数用颜色标识,或添加分面,折线会始终保持连续。
使用plotly包绘制交互式连续折线
plotly可实现带交互效果的连续折线图,操作逻辑同样基于相对天数:
library(plotly) # 预处理数据 dfmelt$year <- year(dfmelt$DATE) dfmelt$day_of_jan <- yday(dfmelt$DATE) # 生成交互式图 plot_ly(dfmelt, x = ~day_of_jan, y = ~value, color = ~as.factor(year), type = 'scatter', mode = 'lines') %>% layout(title = "多年1月降水时间序列", xaxis = list(title = "1月日期(日)", tickvals = seq(1,31,5)), yaxis = list(title = "降水量"))
Python语言解决方案
使用matplotlib绘制连续折线
用Python处理时,同样将日期转换为1月相对天数,即可消除间隔:
import pandas as pd import matplotlib.pyplot as plt # 假设JAN为pandas DataFrame,DATE列已转为日期格式 dfmelt = pd.melt(JAN, id_vars="DATE") dfmelt['day_of_jan'] = dfmelt['DATE'].dt.dayofyear dfmelt['year'] = dfmelt['DATE'].dt.year # 绘制折线图 plt.figure(figsize=(10,6)) for year in dfmelt['year'].unique(): subset = dfmelt[dfmelt['year'] == year] plt.plot(subset['day_of_jan'], subset['value'], label=str(year)) plt.title("多年1月降水时间序列") plt.xlabel("1月日期(日)") plt.ylabel("降水量") plt.xticks(range(1,32,5)) plt.legend() plt.show()
使用seaborn绘制分组连续折线
seaborn的lineplot可直接按年份分组,快速生成连续折线:
import seaborn as sns plt.figure(figsize=(10,6)) sns.lineplot(data=dfmelt, x='day_of_jan', y='value', hue='year', dashes=False) plt.title("多年1月降水时间序列") plt.xlabel("1月日期(日)") plt.ylabel("降水量") plt.xticks(range(1,32,5)) plt.show()
内容的提问来源于stack exchange,提问作者CovetTachi
相关产品推荐
相关产品推荐

