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
相关产品推荐
相关产品推荐

