You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.27 16:27:47