绘制Datetime索引三变量折线图时单个变量呈水平直线问题
问题描述
我想绘制三个变量的折线图,三个变量单独绘制时均呈现曲线,但将它们放在同一张图中绘制时,其中一个变量显示为平行于x轴的直线。三个数据集的索引均为日期时间(Datetime)格式,效果截图及代码如下:

plt.figure(figsize=(16, 8), dpi=150) nig_confz['count'].plot(label='confirmed', color='orange', linewidth=3) nig_recovs['count'].plot(label='recovered',linewidth=3) nig_deaths['count'].plot(label='deaths',color='green',linewidth=3) plt.xlabel('Date') plt.legend()
解决方案
出现这种问题主要有两种常见原因,对应解决方法如下:
1. 数值量级差异过大
如果其中一个变量的数值远小于另外两个(比如死亡数远低于确诊数),线性坐标轴会把小数值的波动压缩成近似直线。可以通过两种方式解决:
- 双y轴展示:给小量级数据分配右侧独立y轴,避免被大数值覆盖:
plt.figure(figsize=(16, 8), dpi=150) # 主坐标轴绘制确诊和康复数据 ax1 = plt.gca() nig_confz['count'].plot(ax=ax1, label='confirmed', color='orange', linewidth=3) nig_recovs['count'].plot(ax=ax1, label='recovered', linewidth=3) ax1.set_xlabel('Date') ax1.set_ylabel('Confirmed/Recovered Count') # 次坐标轴绘制死亡数据 ax2 = ax1.twinx() nig_deaths['count'].plot(ax=ax2, label='deaths', color='green', linewidth=3) ax2.set_ylabel('Deaths Count') # 合并两个坐标轴的图例 lines1, labels1 = ax1.get_legend_handles_labels() lines2, labels2 = ax2.get_legend_handles_labels() ax1.legend(lines1 + lines2, labels1 + labels2, loc='upper left') - 对数坐标轴:适合数值差异极大的场景,能放大小数值的波动:
plt.figure(figsize=(16, 8), dpi=150) nig_confz['count'].plot(label='confirmed', color='orange', linewidth=3) nig_recovs['count'].plot(label='recovered',linewidth=3) nig_deaths['count'].plot(label='deaths',color='green',linewidth=3) plt.xlabel('Date') plt.yscale('log') # 启用对数y轴 plt.legend()
2. 日期索引未对齐
三个数据集的日期索引可能存在缺失、错位或不匹配,导致绘图时自动补全为固定值。可以先验证并对齐索引:
# 检查三个数据集的索引是否完全一致 print(nig_confz.index.equals(nig_recovs.index)) print(nig_confz.index.equals(nig_deaths.index)) # 如果索引不一致,合并数据时自动对齐 merged_df = pd.concat( [nig_confz['count'], nig_recovs['count'], nig_deaths['count']], axis=1, keys=['confirmed', 'recovered', 'deaths'] ) merged_df.plot(figsize=(16, 8), dpi=150, linewidth=3) plt.xlabel('Date') plt.legend()
内容的提问来源于stack exchange,提问作者Lawalson Tomiwa
相关产品推荐
相关产品推荐

