我正在尝试使用 pandas dataframe 绘图方法绘制堆叠条形图。x 值是浮点数,我尝试以整数间隔设置 xticks,但没有成功。这是我的代码
import pandas as pd
import numpy as np
from matplotlib import pyplot as plt
data = [[0.0, 4.9, 19.9, 8.1, 0.0], [0.12, 4.5, 27.0, 10.1, 0.0],
[0.24, 2.8, 9.3, 4.6, 0.0], [0.36, 2.2, 9.1, 2.7, 0.0],
[0.48, 2.2, 7.3, 3.1, 0.0], [1.0, 4.9, 26.4, 11.2, 0.0],
[1.12, 5.9, 25.3, 8.7, 0.0], [1.24, 3.7, 13.3, 7.1, 0.0],
[1.3599999999999999, 3.0, 9.5, 3.4, 0.0], [1.48, 3.2, 8.9, 4.7, 0.0],
[2.0, 8.4, 24.8, 20.2, 0.0], [2.12, 9.5, 19.3, 22.5, 0.0],
[2.24, 5.7, 11.8, 6.6, 0.0], [2.36, 4.1, 11.1, 5.1, 0.0],
[2.48, 5.4, 8.0, 4.6, 0.0]]
df = pd.DataFrame(columns = ['xval', 'y1', 'y2', 'y3', 'y4'], data = data)
fig, ax = plt.subplots()
df.plot(x = 'xval', kind = 'bar', ax = ax, stacked = True)
xticks = [x for x in df['xval'] if int(x) == x]
ticklabel = ['{:.1f}'.format(x) for x in xticks]
ax.set_xticks(xticks, labels = ticklabel)
ax.grid()
fig.savefig('mychart.png')
当你绘制条形图时,pandas 绘图程序实际上会将条形刻度位置设置为整数(在你的情况下为 0-14),同时用实际的 x 值标记它们。你可以这样做:
生成:
在我看来,原始方法的问题在于 x 轴实际上并未使用一些实数线(因为如果发生这种情况,条形图的间距将不相等)。您可以通过重新排序数据行并看到条形图和标签会移动来查看此操作,无论事物是否已排序(最容易在没有 xticks-rewriting 代码的情况下看到)。
因此,xticks 实际上应该是相关条形的序数。在本例中,“0.0”、“1.0”和“2.0”标签应分别位于条形 0、5 和 10(而不是0、1 和 2)。