如何在 Pandas / Matplotlib 直方图中更改 x 轴标签的顺序?

5
假设我有一个 Pandas 数据框,其中一列包含离散值。
import pandas as pd

data = ['A']*2 + ['C']*3 + ['B']* 1
print(data)
# ['A', 'A', 'C', 'C', 'C', 'B']

my_df = pd.DataFrame({'mycolumn': data})
print(my_df)
#   mycolumn
# 0        A
# 1        A
# 2        C
# 3        C
# 4        C
# 5        B

我接着创建一个直方图,显示这些数值的频率。我使用Pandas内置函数hist(),该函数依赖于Matplotlib的直方图函数。

my_df.mycolumn.hist()

enter image description here

如何改变图表 X 轴标签的顺序呢?例如,我想用特定顺序 C, A, B 替换默认顺序 A, C, B

此外,如何将 Y 轴从浮点数更改为整数?这里的频率值是离散计数。


3
你需要创建一个条形图,而不是直方图。 - BigBen
2
针对您的新问题:matplotlib 限制为整数刻度位置from matplotlib.ticker import MaxNLocator; plt.gca().yaxis.set_major_locator(MaxNLocator(integer=True)) - JohanC
2
除了上面所示的答案,您还可以使用 pandas.Categoricalmycolumn 指定为分类变量,并设置顺序。 - Trenton McKinney
2
如前所述,这实际上是一个具有“计数”而非直方图的条形图。请参阅此问题以获取示例。有两个答案,我给出的那个答案显示了分布(正如OP所期望的那样),而另一个答案则显示了事件发生的次数,就像您所做的一样。我认为这两个答案将为您说明区别。 - Trenton McKinney
1
主要问题在于您的数据是分类数据而不是数值数据。hist 的 API 不能有效地将类别进行分组,因此只能生成条形图。例如,如果您将所有字母映射为数字,您就可以看到 hist API 如何将数字分组以显示分布情况。 - Trenton McKinney
2个回答

10

您可以使用 value_countsloc 定义顺序,并使用 bar 绘图:

my_df['mycolumn'].value_counts().loc[['C', 'A', 'B']].plot.bar()

enter image description here

要在x轴上使用整数,请添加:

ax.yaxis.set_major_locator(MaxNLocator(integer=True))

enter image description here


1
你可以创建一个 sorter 字典,在绘图之前对数据帧进行排序。对于整数,你可以使用 MaxNLocator
import pandas as pd
from matplotlib.ticker import MaxNLocator
fig, ax = plt.subplots()
data = ['A']*2 + ['C']*3 + ['B']* 1
my_df = pd.DataFrame({'mycolumn': data})
sorter = dict([(k, v) for (v,k) in enumerate(['C', 'A', 'B'])])
(my_df.assign(sorter=my_df['mycolumn'].map(sorter))
      .sort_values('sorter')['mycolumn'].value_counts().plot.bar(ax=ax))
ax.yaxis.set_major_locator(MaxNLocator(integer=True))

enter image description here


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接