Python matplotlib绘制带次Y轴短柱图如何实现Excel同款效果
Python双Y轴图表绘制问题
需求
实现和Excel生成效果一致的双Y轴图表,配置要求:
- X轴:维度为Stock
- 主Y轴(y1):以分组柱状图展示百分比格式的Q1、Q2、Q3 Result数据
- 次Y轴(y2):以散点/无连线线段形式展示百分比格式的Net Exposure数据
现有代码
import pandas as pd import matplotlib.pyplot as plt data = {'Stock': ['A', 'B', 'C'], 'Q1 Result': [-0.005, 0.02, 0.0434], 'Q2 Result': [0.0248, 0.003, 0.0051], 'Q3 Result': [0.0723, 0.0071, -0.0035], 'Net Exposure': [0.8511, 0.5873,-0.4671]} df = pd.DataFrame(data) ax=df.plot.bar(x = 'Stock', y = ['Q1 Result', 'Q2 Result','Q3 Result']) ax2=df.plot.line(x = 'Stock', y = ['Net Exposure']) df.plot.line(ax=ax.twinx(), secondary_y=range(-100, 100))
当前代码运行效果

目标参考效果(Excel生成)

问题原因&修正代码
原代码存在3个核心错误:
- 单独调用
df.plot.line()会生成独立新画布,无法和柱状图在同一张图展示 secondary_y参数用途为指定需要放到次轴的列名,传入坐标范围属于参数误用- 未设置坐标轴百分比格式,Net Exposure未配置为无连线的标记点样式,和Excel效果不符
修正后可直接运行的代码:
import pandas as pd import matplotlib.pyplot as plt from matplotlib.ticker import PercentFormatter data = {'Stock': ['A', 'B', 'C'], 'Q1 Result': [-0.005, 0.02, 0.0434], 'Q2 Result': [0.0248, 0.003, 0.0051], 'Q3 Result': [0.0723, 0.0071, -0.0035], 'Net Exposure': [0.8511, 0.5873,-0.4671]} df = pd.DataFrame(data) # 绘制主Y轴分组柱状图 fig, ax = plt.subplots() df.plot.bar(x='Stock', y=['Q1 Result', 'Q2 Result', 'Q3 Result'], ax=ax, width=0.8) # 主Y轴配置百分比格式 ax.yaxis.set_major_formatter(PercentFormatter(xmax=1, decimals=1)) # 创建次Y轴,绘制无连线的圆点标记,匹配Excel的Net Exposure展示样式 ax2 = ax.twinx() df.plot.line( x='Stock', y='Net Exposure', ax=ax2, linestyle='', # 取消点之间的连线 marker='o', # 设置圆点标记 color='#FF00FF', # 匹配Excel的洋红色标记 markersize=8 ) # 次Y轴配置百分比格式,设置和Excel一致的-100%~100%显示范围 ax2.set_ylim(-1, 1) ax2.yaxis.set_major_formatter(PercentFormatter(xmax=1, decimals=0)) # 分开设置两个轴的图例位置,避免遮挡 ax.legend(loc='upper left') ax2.legend(loc='upper right') plt.tight_layout() plt.show()
运行后输出效果和Excel版本完全一致。
内容的提问来源于stack exchange,提问作者Jodie
相关产品推荐
相关产品推荐

