【问题标题】:Change x-axis order of labels in Pandas / Matplotlib histogram?更改 Pandas / Matplotlib 直方图中标签的 x 轴顺序?
【发布时间】:2021-04-18 21:07:18
【问题描述】:

假设我有一个 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()

现在,如何将 X 轴上的标签顺序更改为具有特定顺序? 例如,我希望 x 轴具有特定顺序的标签: C, A, B,而不是如图所示的 A, C, B

另外,如何将 y 轴更改为整数而不是浮点数?频率值是离散计数。

【问题讨论】:

  • 您需要创建条形图,而不是直方图。
  • 对于您的新问题:matplotlib restrict to integer tick locationsfrom matplotlib.ticker import MaxNLocator; plt.gca().yaxis.set_major_locator(MaxNLocator(integer=True))
  • 除了显示的答案之外,您还可以使用pandas.Categoricalmycolumn 指定为分类,您可以在其中设置顺序。
  • 如前所述,这实际上是带有count 的条形图,而不是直方图。有关示例,请参阅此 question。有两个答案,我为那个 OP 给出的一个显示了一个分布(正如操作所希望的那样),另一个答案显示了出现次数,就像你正在做的那样。我认为这两个答案将为您说明差异。
  • 主要问题归结为您的数据是分类数据而不是数字数据。 hist 的 API 不能有效地 bin 类别,所以你只有一个条形图。例如,如果您要将所有字母映射到数字,您会看到hist api 如何对数字组进行分类以显示分布。

标签: python pandas matplotlib


【解决方案1】:

您可以创建一个sorter dict 在绘图之前对您的数据框进行排序。对于整数,可以使用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))

【讨论】:

    【解决方案2】:

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

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

    Solution 在 y 轴上使用整数:

    from matplotlib.ticker import MaxNLocator
    
    ax = my_df.mycolumn.value_counts().loc[['C', 'A', 'B']].plot.bar()
    
    ax.yaxis.set_major_locator(MaxNLocator(integer=True))
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-04-03
      • 2020-03-29
      • 2017-11-17
      • 2020-02-04
      • 2020-09-05
      • 2020-11-23
      相关资源
      最近更新 更多