如何创建X轴为天数、按年份着色的累计行驶距离折线图
累计行驶距离折线图绘制修正方案
需求说明
绘制累计行驶距离折线图,要求:
- 每年数据使用不同颜色区分
- X轴设置为一年中的天数(如1-365),便于对比各年份行驶趋势差异
示例数据集
| date | distance |
|---|---|
| 01/01/2010 | 8 |
| 02/01/2010 | 5 |
| 03/01/2010 | 6 |
| 04/01/2010 | 9 |
| 05/01/2010 | 12 |
| 06/01/2010 | 7 |
| 07/01/2010 | 9 |
| 08/01/2010 | 6 |
当前使用代码
import pandas as pd import matplotlib.pyplot as plt df = pd.read_csv('sample_data.csv') df['date'] = pd.to_datetime(df['date']) df_years = df[df['date'].dt.year.isin(range(2010, 2016))] df_years = df_years.sort_values(by='date') cumulative_distance = df_years.groupby(df_years['date'].dt.year)['distance'].cumsum() colors= ['white', 'white', 'white', 'white', 'white', 'white'] for year, color in zip(range(2010,2016), colors): mask = (df_years['date'].dt.year == year) plt.plot(df_years.loc[mask, 'date'], cumulative_distance[mask], color=color, label=str(year)) plt.title('Cumulative Distance Traveled in 2010 - 2015') plt.xlabel('Date') plt.ylabel('Distance') plt.legend() plt.show()
效果问题
- 期望效果:X轴为一年中的天数,各年份折线在同一X轴范围平行展示,颜色区分明显
- 当前问题:X轴是具体日期导致年份分散,且颜色全白无法看到折线
修正代码及说明
关键修改点:
- 新增
day_of_year字段,将日期转换为一年中的天数,作为X轴数据 - 替换颜色列表为可区分的彩色值
- 将累计距离合并到原数据框,方便按年份筛选绘图
- 绘图时X轴使用
day_of_year而非原始日期
完整修正代码
import pandas as pd import matplotlib.pyplot as plt # 读取并处理数据 df = pd.read_csv('sample_data.csv') df['date'] = pd.to_datetime(df['date']) # 筛选目标年份数据并排序 df_years = df[df['date'].dt.year.isin(range(2010, 2016))].sort_values(by='date') # 计算一年中的天数和累计行驶距离 df_years['day_of_year'] = df_years['date'].dt.dayofyear df_years['cumulative_distance'] = df_years.groupby(df_years['date'].dt.year)['distance'].cumsum() # 定义区分度高的颜色列表 colors = ['#1f77b4', '#ff7f0e', '#2ca02c', '#d62728', '#9467bd', '#8c564b'] # 按年份绘图 for year, color in zip(range(2010, 2016), colors): year_data = df_years[df_years['date'].dt.year == year] plt.plot(year_data['day_of_year'], year_data['cumulative_distance'], color=color, label=str(year)) # 设置图表样式 plt.title('Cumulative Distance Traveled (2010-2015)') plt.xlabel('Day of Year') plt.ylabel('Total Cumulative Distance') plt.xlim(1, 366) # 覆盖全年天数范围 plt.legend(title='Year') plt.grid(alpha=0.3) plt.show()
内容的提问来源于stack exchange,提问作者Pablo3090
相关产品推荐
相关产品推荐

