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

Pandas绘图行为不一致:折线图为何从size=2开始而非size=1?

问题描述

使用Pandas结合Matplotlib绘制可视化图表时,堆叠柱状图从size=1开始展示,但折线图却和size=2的柱子对齐,二者表现不一致。

复现代码如下:

import matplotlib.pyplot as plt
import pandas as pd

data = {
    'size': [1, 2, 3, 4, 5, 6],
    'Yes': [1100.65, 1185.08, 338.30, 336.70, 58.61, 0.00],
    'No': [1700.32, 1380.81, 546.25, 722.00, 91.73, 139.32]
}

df = pd.DataFrame(data).set_index('size')
print(df)

# Plot data
fig, ax = plt.subplots(figsize=(10, 6))

# Plot stacked bar chart on primary axis
df.plot(kind='bar', stacked=True, ax=ax, legend=False)

# Plot line chart on primary axis (same as bar chart)
df.plot(kind='line', ax=ax, legend=False)

plt.show()

图表效果截图:
图表效果截图

原因分析

这是因为Pandas对柱状图和折线图的x轴处理逻辑完全不同:

  • 堆叠柱状图(bar类型):Pandas会把DataFrame的索引当作分类标签处理,x轴的实际坐标是从0开始的连续整数(0对应size=1,1对应size=2,以此类推),只是显示的标签是索引的数值。
  • 折线图(line类型):Pandas默认会把索引当作数值型数据处理,直接用索引的真实数值(1、2、3...6)作为x轴坐标。

两者x轴坐标不匹配,就导致折线图的第一个数据点(x=1)对应到了柱状图x=1的位置(也就是size=2的柱子),看起来像是折线从size=2起始。

解决方法

有两种简单的方式可以让两者对齐:

方法一:将折线图的x轴坐标改为柱状图的位置

获取柱状图的x轴刻度位置,绘制折线图时指定该位置:

import matplotlib.pyplot as plt
import pandas as pd

data = {
    'size': [1, 2, 3, 4, 5, 6],
    'Yes': [1100.65, 1185.08, 338.30, 336.70, 58.61, 0.00],
    'No': [1700.32, 1380.81, 546.25, 722.00, 91.73, 139.32]
}

df = pd.DataFrame(data).set_index('size')

fig, ax = plt.subplots(figsize=(10, 6))

# 绘制堆叠柱状图
df.plot(kind='bar', stacked=True, ax=ax, legend=False)
# 获取柱状图的x轴位置
x_positions = ax.get_xticks()
# 指定x轴位置绘制折线图
df.plot(kind='line', ax=ax, legend=False, x=x_positions)

plt.show()

方法二:将索引转为字符串类型

把DataFrame的索引转换成字符串,让Pandas把折线图的x轴也当作分类标签处理:

import matplotlib.pyplot as plt
import pandas as pd

data = {
    'size': [1, 2, 3, 4, 5, 6],
    'Yes': [1100.65, 1185.08, 338.30, 336.70, 58.61, 0.00],
    'No': [1700.32, 1380.81, 546.25, 722.00, 91.73, 139.32]
}

df = pd.DataFrame(data).set_index('size')
# 将索引转为字符串
df.index = df.index.astype(str)

fig, ax = plt.subplots(figsize=(10, 6))

df.plot(kind='bar', stacked=True, ax=ax, legend=False)
df.plot(kind='line', ax=ax, legend=False)

plt.show()

内容的提问来源于stack exchange,提问作者itthrill

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.20 09:31:17