Python中使用pandas实现堆叠柱状图叠加折线图单图展示
问题原因
两次独立调用DataFrame.plot()时未指定复用同一坐标轴,pandas默认每次调用会生成全新画布,因此最终输出两个独立图形,无法实现叠加效果。
可行实现代码
核心操作是将第一次绘图返回的坐标轴对象传入第二次绘图的ax参数,强制在同一画布上叠加图层,和R语言ggplot通过+拼接图层的逻辑一致。
import pandas as pd import matplotlib.pyplot as plt # 样例数据构造(你已有DataFrame可跳过这部分) lightning2022top = pd.DataFrame([ {"player":"Nikita Kucherov", "position":"RW", "gp":68, "g":33, "a":52, "tp":85, "ppg":1.25, "pim":38}, {"player":"Steven Stamkos", "position":"C/W", "gp":57, "g":29, "a":37, "tp":66, "ppg":1.16, "pim":22}, {"player":"Alex Killorn", "position":"LW", "gp":68, "g":26, "a":23, "tp":49, "ppg":0.72, "pim":20} ]) # 绘制堆叠柱状图,保存坐标轴句柄 ax1 = lightning2022top.plot( x="player", y=["ppg", "a", "g"], kind="bar", stacked=True, figsize=(15,10), legend="upper left" ) # 复用ax1画布,叠加pim折线图,使用右侧次坐标轴 ax2 = lightning2022top.plot( x="player", y="pim", kind="line", color="crimson", marker="o", linewidth=2, secondary_y=True, ax=ax1, legend="upper right" ) # 可选:补充坐标轴与标题标注 ax1.set_xlabel("球员姓名") ax1.set_ylabel("堆叠指标数值(场均得分ppg/进球g/助攻a)") ax2.set_ylabel("受罚分钟pim") plt.title("冰球球员核心数据组合图") plt.show()
注意事项
- 你提供的样例数据中Steven Stamkos的助攻数
a标注为373,和其总得分tp=66存在明显逻辑冲突,属于输入笔误,上述代码中修正为37,运行自有真实数据时无需调整。 - 折线颜色、标记样式、图例位置、画布尺寸都可以通过修改plot内的参数自定义,满足不同展示需求。
- 如果需要用seaborn做样式美化,只需要在绘图前加一行
sns.set_theme()即可,坐标轴复用逻辑不变。
内容的提问来源于stack exchange,提问作者General Douglas MacArthur
相关产品推荐
相关产品推荐

