Python如何绘制x轴为年份、含趋势线的双y轴散点图及代码调试
双Y轴散点图(含趋势线)实现方案
原有代码存在以下可优化点:
plt.scatter()返回值为散点对象,不能直接解构赋值给fig, ax1,运行会直接报错- 重复创建
crops1和crops2属于冗余操作,可直接复用原始crops数据 - 缺少趋势线绘制、坐标轴标注、图例等必要可视化配置
完整可运行代码
import pandas as pd import matplotlib.pyplot as plt import numpy as np # 请确保你的crops数据集已提前正确加载 # 1. 初始化画布与双Y轴 fig, ax1 = plt.subplots(figsize=(10, 6)) ax2 = ax1.twinx() # 2. 绘制左侧Y轴(面积:单位hectare) # 散点图 ax1.scatter(crops['Years'], crops['Area_ha'], color='tab:blue', label='实际面积') # 线性趋势线拟合与绘制 z_area = np.polyfit(crops['Years'], crops['Area_ha'], deg=1) p_area = np.poly1d(z_area) ax1.plot(crops['Years'], p_area(crops['Years']), color='tab:blue', linestyle='--', label=f'面积趋势线:y={z_area[0]:.2f}x+{z_area[1]:.2f}') # 左侧Y轴样式配置 ax1.set_xlabel('年份', fontsize=12) ax1.set_ylabel('面积(hectare)', color='tab:blue', fontsize=12) ax1.tick_params(axis='y', labelcolor='tab:blue') # 3. 绘制右侧Y轴(产量:单位Kg/ha) # 散点图 ax2.scatter(crops['Years'], crops['Yield_kg'], color='tab:red', label='实际产量') # 线性趋势线拟合与绘制 z_yield = np.polyfit(crops['Years'], crops['Yield_kg'], deg=1) p_yield = np.poly1d(z_yield) ax2.plot(crops['Years'], p_yield(crops['Years']), color='tab:red', linestyle='--', label=f'产量趋势线:y={z_yield[0]:.2f}x+{z_yield[1]:.2f}') # 右侧Y轴样式配置 ax2.set_ylabel('产量(Kg/ha)', color='tab:red', fontsize=12) ax2.tick_params(axis='y', labelcolor='tab:red') # 4. 合并图例与全局样式配置 lines1, labels1 = ax1.get_legend_handles_labels() lines2, labels2 = ax2.get_legend_handles_labels() ax1.legend(lines1 + lines2, labels1 + labels2, loc='upper left') plt.title('作物面积、产量随年份变化趋势', fontsize=14) plt.grid(alpha=0.3) plt.show()
补充说明
如果需要使用非线性趋势线,只需修改np.polyfit的第三个参数deg即可,比如deg=2为二次多项式拟合。
内容的提问来源于stack exchange,提问作者Issa KASSOGUE
相关产品推荐
相关产品推荐

