如何在matplotlib中将直方图中的标签居中

voj*_*tam 3 python matplotlib

我有以下问题。我需要在 plt.hist() 的 X 轴上将标签居中。我在这里找到了一些答案:How to center labels in histogramplot建议使用align = "left/mid/right" . 但是,它没有给我正确的输出:

plt.hist(data['Col1'], align='left') 在此输入图像描述

plt.hist(data['Col1'], align='mid') 在此输入图像描述

plt.hist(data['Col1'], align='right') 在此输入图像描述

我想让ok18 let正好位于每个小节的中间。请问我该如何修复它?

整个代码:

plt.style.use('ggplot')
plt.xticks(rotation='vertical')
plt.locator_params(axis='y', integer=True)
plt.suptitle('My histogram', fontsize=14, fontweight='bold')
plt.ylabel('Frequency', fontweight='bold')


plt.hist(data['Col1'], align='mid')
plt.show()
Run Code Online (Sandbox Code Playgroud)

Joh*_*anC 6

Matplotlib 的hist()默认参数主要用于连续数据。当没有给出参数时,matplotlib 将值的范围划分为 10 个大小相等的容器。

当给定字符串数据时,matplotlib 在内部将字符串替换为数字0, 1, 2, ...。在这种情况下,“ok”获得了值0,“18 let”获得了值1。将该范围分为 10,创建 10 个 bin:0.0-0.1, 0.1-0.2, ..., 0.9-1.0。条形图放置在 bin 中心 ( 0.05, 0.15, ..., 0.95) 并默认对齐'mid'。(当您想要绘制较窄的条形时,这种居中很有帮助。)在这种情况下,除了第一个和最后一个条形之外的所有条形都将具有 height 0

这是正在发生的事情的可视化。垂直线显示容器边界的放置位置。

from matplotlib import pyplot as plt
import numpy as np
import pandas as pd

data = pd.DataFrame({'Col1': np.random.choice(['ok', '18 let'], 10, p=[0.2, 0.8])})

plt.style.use('ggplot')
fig, ax = plt.subplots()
ax.locator_params(axis='y', integer=True)
ax.set_ylabel('Frequency', fontweight='bold')

_counts, bin_boundaries, _patches = ax.hist(data['Col1'])
for i in bin_boundaries:
    ax.axvline(i, color='navy', ls='--')
    ax.text(i, 1.01, f'{i:.1f}', transform=ax.get_xaxis_transform(), ha='center', va='bottom', color='navy')
plt.show()
Run Code Online (Sandbox Code Playgroud)

可视化 plt.hist

为了更好地控制离散数据的直方图,最好给出明确的分箱,很好地围绕给定值(例如plt.hist(..., bins=[-0.5, 0.5, 1.5]))。更好的方法是创建计数图:对各个值进行计数并绘制条形图(直方图只是条形图的一种特定类型)。

这是此类“计数图”的示例。(请注意,return_counts=numpy 的参数np.unique()仅适用于较新的版本,即 1.9 及更高版本。)

from matplotlib import pyplot as plt
import numpy as np
import pandas as pd

data = pd.DataFrame({'Col1': np.random.choice(['ok', '18 let'], 10, p=[0.2, 0.8])})

plt.style.use('ggplot')
plt.locator_params(axis='y', integer=True)
plt.ylabel('Frequency', fontweight='bold')

labels, counts = np.unique(data['Col1'], return_counts=True)
plt.bar(labels, counts)
plt.show()
Run Code Online (Sandbox Code Playgroud)

带计数的条形图

请注意,seabornhistplot()可以更好地处理离散数据。当使用字符串或显式设置 时discrete=True,会自动计算适当的 bin。