如何使用 Matplotlib 添加条形标签

How to add bar labels using Matplotlib

我有以下数据框。

                  _id                               message_date_time         country
0   {'$oid': '61f7dfd24b11720cdbda5c86'}    {'$date': '2021-12-24T12:30:09Z'}   RUS
1   {'$oid': '61f7eb7b4b11720cdbda9322'}    {'$date': '2021-12-20T21:58:20Z'}   RUS
2   {'$oid': '61f7fdad4b11720cdbdb0beb'}    {'$date': '2021-12-15T15:29:13Z'}   RUS
3   {'$oid': '61f8234f4b11720cdbdbec52'}    {'$date': '2021-12-10T00:03:43Z'}   USA
4   {'$oid': '61f82c274b11720cdbdc21c7'}    {'$date': '2021-12-09T15:10:35Z'}   USA

有了这些值

df["country"].value_counts()

RUS    156
USA    139
FRA     19
GBR     11
AUT      9
AUS      8
DEU      7
CAN      4
BLR      3
ROU      3
GRC      3
NOR      3
NLD      3
SWE      2
ESP      2
CHE      2
POL      1
HUN      1
DNK      1
ITA      1
ISL      1
BIH      1
Name: country, dtype: int64

我正在尝试使用以下方法使用国家和频率进行绘图:

plt.figure(figsize=(15, 8))
plt.xlabel("Frequency")
plt.ylabel("Country")
plt.hist(df["country"])
plt.show()

我需要的是在每个条上方显示国家/地区频率并在条之间保持非常小的 space。

为此,我使用了 seaborn 中的 countplot,因为它更适合检查系列中每个对象的计数。

plt.figure(figsize = (20,5))
bars = plt.bar(df["country"], df["counts"])
for bar in bars.patches:
  plt.annotate(s = bar.get_height(), xy = (bar.get_x() + bar.get_width() / 2, bar.get_height()), va = "bottom", ha = "center")
plt.show()

输出应该是这样的,

如果您想在图表上显示其他内容而不是高度,只需将 annotate 函数中的 s 参数更改为您选择的值即可。

可以说是最简单的使用方式plt.bar()。例如:

counts = df["country"].value_counts()
names, values = counts.index.tolist(), counts.values.tolist()
plt.bar(names, values)
height_above_bar = 0.05  # distance of count from bar
fontsize = 12  # the fontsize that you want the count to have
for i, val in enumerate(values):
    plt.text(i, val + height_above_bar, str(val), fontsize=12)
plt.show()