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

3
我有一个问题。 我需要在plt.hist()上将标签居中在X轴上。 我在这里找到了一些答案:如何在直方图图中居中标签,建议使用align = "left / mid / right"。 然而,它并没有给我正确的输出: plt.hist(data ['Col1'],align ='left') enter image description here plt.hist(data ['Col1'],align ='mid') enter image description here plt.hist(data ['Col1'],align ='right') enter image description here 我希望在每个条形图的中间精确地放置“ok”和“18 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()

2
代码?看起来你做得很对,但是你有一个额外的bin,会使对齐出现问题。 - Reti43
我把它放在下面,谢谢回复。 - vojtam
1个回答

6
Matplotlib的hist()默认参数主要用于连续数据。当没有给出参数时,matplotlib将值范围分成10个大小相等的箱子。当给出字符串数据时,matplotlib会在内部用数字0,1,2,...替换字符串。在这种情况下,“ok”得到了值0,“18 let”得到了值1。将该范围分成10个箱子:0.0-0.1,0.1-0.2,...,0.9-1.0。条形图放置在箱子中心(0.05、0.15、...,0.95),默认对齐方式为'mid'。(这种居中有助于绘制更窄的条形图。)在这种情况下,除了第一和最后一个条形图之外,所有条形图的高度都为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()

visualizing  plt.hist

为了更好地控制离散数据的直方图,最好给出明确的区间范围,使其与给定值相匹配(例如:plt.hist(..., bins=[-0.5, 0.5, 1.5]))。更好的方法是创建计数图:计算个体值并绘制条形图(直方图只是一种特定类型的条形图)。
以下是这样一个“计数图”的示例。(请注意,numpy的np.unique()return_counts=参数仅适用于新版本,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()

bar plot with counts

请注意,seaborn的histplot()更适合处理离散数据。当处理字符串或明确设置discrete=True时,适当的区间将自动计算。

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