如何为双坐标轴股票趋势图添加更多股票?
如何在双坐标轴图表的第二轴添加更多股票
我来帮你搞定这个问题!要在第二坐标轴上添加更多股票其实非常简单,核心就是复用已经创建好的ax2对象,不用再新建额外的双坐标轴啦。先帮你修正原代码里的小问题,再一步步教你扩展。
原代码的小问题
首先注意:原代码里先执行了fig, ax1 = plt.subplots(),之后又fig = plt.figure(figsize=(6,4)),这会直接覆盖之前创建的fig对象,导致第一个画布被丢弃,正确的做法是把figsize参数放到subplots()里。
修改后的完整代码(支持多只股票)
假设你的newdf里已经有了更多股票的数据(比如GOOG、MSFT),修改后的代码如下:
import matplotlib.pyplot as plt # 假设newdf包含date、IBM、AAPL、GOOG、MSFT等列 fig, ax1 = plt.subplots(figsize=(6,4)) # 把画布尺寸参数放在这里,避免重复创建fig t = newdf['date'] # --- 第一坐标轴:IBM --- s1 = newdf['IBM'] ax1.plot(t, s1, 'b-', label='IBM') ax1.set_xlabel('Dates', fontsize=14) ax1.set_xticklabels(t, rotation=45) ax1.set_ylabel('Price', color='b') ax1.tick_params('y', colors='b') ax1.grid() ax1.legend(loc=0) # --- 第二坐标轴:多只股票 --- ax2 = ax1.twinx() # 绘制AAPL s2 = newdf['AAPL'] ax2.plot(t, s2, 'r-', label='AAPL') # 绘制GOOG s3 = newdf['GOOG'] ax2.plot(t, s3, 'g-', label='GOOG') # 绘制MSFT s4 = newdf['MSFT'] ax2.plot(t, s4, 'orange', label='MSFT') # 设置第二坐标轴的样式 ax2.set_ylabel('Price', color='darkred') # 选一个中性色作为轴标签,避免和某只股票颜色冲突 ax2.tick_params('y', colors='darkred') ax2.legend(loc=2) fig.tight_layout() plt.show()
关键步骤说明
- 复用
ax2对象:所有要放在第二坐标轴的股票,都用ax2.plot()来绘制,每只股票指定不同的颜色和label参数,这样图例才能正确显示每只股票的名称。 - 图例优化:给每个
plot()加上label后,调用ax2.legend()就能一次性显示第二坐标轴所有股票的图例;如果想要把两个坐标轴的图例合并,可以收集所有线的对象,再统一创建图例(比如lines1, labels1 = ax1.get_legend_handles_labels(),lines2, labels2 = ax2.get_legend_handles_labels(),然后ax1.legend(lines1+lines2, labels1+labels2, loc=0))。 - 样式一致性:第二坐标轴的刻度颜色建议用统一的颜色,不要给每只股票单独设置刻度色,否则会让图表显得混乱,保持视觉简洁更重要。
原图表效果

扩展后预期效果参考

内容的提问来源于stack exchange,提问作者Ann Kriebel
相关产品推荐
相关产品推荐

