Matplotlib绘制乘客量折线图异常问题求助
问题排查与解决方案
核心现象:使用plt.plot(df_pass_by_year_pd['Date'], df_pass_by_year_pd['Prediction'])能正常生成线性回归曲线,但替换为PassengerCountSum后图表显示异常,以下是常见排查方向和解决办法:
1. 检查PassengerCountSum的数据有效性
- 先确认该列是否存在非数值类型或空值:
print(df_pass_by_year_pd['PassengerCountSum'].dtype) print(df_pass_by_year_pd['PassengerCountSum'].isna().sum())- 若为字符串类型,转换为数值:
df_pass_by_year_pd['PassengerCountSum'] = pd.to_numeric(df_pass_by_year_pd['PassengerCountSum'], errors='coerce') - 若存在空值,按需填充(比如用前向填充或均值):
df_pass_by_year_pd['PassengerCountSum'] = df_pass_by_year_pd['PassengerCountSum'].fillna(method='ffill')
- 若为字符串类型,转换为数值:
2. 确保Date列按时间排序
折线图异常最常见的原因是X轴日期未按顺序排列——回归值Prediction本身是有序序列所以不受影响,但原始客流数据可能存在日期乱序:
- 先对数据按
Date排序:
排序后重新绘图:df_pass_by_year_pd = df_pass_by_year_pd.sort_values('Date')plt.plot(df_pass_by_year_pd['Date'], df_pass_by_year_pd['PassengerCountSum']) plt.plot(df_pass_by_year_pd['Date'], df_pass_by_year_pd['Prediction']) plt.xticks(rotation=45) plt.show()
3. 处理数值量级差异
如果PassengerCountSum和Prediction的数值量级差距过大,会导致其中一条线被压缩到几乎不可见,看起来像异常。可以用双Y轴分别展示:
fig, ax1 = plt.subplots(figsize=(10,6)) # 绘制客流数据 ax1.plot(df_pass_by_year_pd['Date'], df_pass_by_year_pd['PassengerCountSum'], color='#1f77b4', label='Passenger Count') ax1.set_xlabel('Date') ax1.set_ylabel('Passenger Count Sum', color='#1f77b4') ax1.tick_params(axis='y', labelcolor='#1f77b4') ax1.legend(loc='upper left') # 绘制回归预测曲线 ax2 = ax1.twinx() ax2.plot(df_pass_by_year_pd['Date'], df_pass_by_year_pd['Prediction'], color='#ff7f0e', label='Prediction') ax2.set_ylabel('Prediction', color='#ff7f0e') ax2.tick_params(axis='y', labelcolor='#ff7f0e') ax2.legend(loc='upper right') plt.xticks(rotation=45) plt.tight_layout() plt.show()
4. 尝试用Pandas内置绘图方法
直接使用Matplotlib的plt.plot可能存在类型适配问题,改用Pandas自带的plot方法更适配DataFrame结构:
df_pass_by_year_pd.sort_values('Date').plot(x='Date', y=['PassengerCountSum', 'Prediction'], kind='line', figsize=(10,6)) plt.xticks(rotation=45) plt.tight_layout() plt.show()
内容的提问来源于stack exchange,提问作者BigGiorgio
相关产品推荐
相关产品推荐

