特定数据输入不会显示轴注释和文本

问题描述 投票:0回答:1

在 python 中使用 matplotlib 我遇到问题,对于特定输入轴注释和轴标签未显示。

我写了以下代码:

df = pd.read_csv(os.path.join(input_path, "data.csv"), sep=",")

category = df.columns[1]
items = df[df.columns[0]]

_, ax = plt.subplots(figsize=(10, 6))

x_coordinates = np.arange(len(items))
ax.plot(
    x_coordinates,
    list(df[category]),
    label=category.title(),
)

ax.set_xlabel(items.name.title())
ax.set_ylabel(category.title())
ax.set_title("Test chart", wrap=True)
ax.set_xticks(x_coordinates, [str(item).title() for item in items])

y_coordinates = list(df[df.columns[1]])
x_coordinates = list(items)

for x_coordinate, y_coordinate in zip(x_coordinates, y_coordinates):
    ax.text(
        x_coordinate - 1,
        y_coordinate,
        y_coordinate,  # This is the text that should be displayed
        dict(zorder=10, size=10, color="black", ha="center"),
    )

plt.savefig("output.png")

让我们看看这个输入数据.csv:

week,attendance
1,74788
2,74884
3,57677
4,74879
5,52632
6,74997
7,74292
8,49699
9,74908
10,74482
11,74379
12,42910
13,74186
14,37886
15,60038

文本/注释绘制正确:

correct annotation

但是,给定以下输入 data.csv:

year,purse
2001,60000
2002,60000
2003,60000
2004,70000
2005,70000
2006,85000
2007,100000
2008,100000
2009,110000
2010,120000
2011,120000
2012,100000
2013,100000

绘制如下图表:

missing annotation

我观察到其他数据输入的相同行为。有些会显示注释,有些则不会。我找不到关于输入数据出现问题的原因的共同点。我的代码中是否存在我忽略的错误?

使用 ax.annotate(也构建在 ax.text 之上)也会出现同样的问题:

    ax.annotate(
        value_label,
        xy=(x_coordinate - 1, y_coordinate),
        textcoords="offset points",
        xytext=(0, 0),
        zorder=10,
    )

我尝试调试该问题,但 .text/.annotate 的所有输入值都是正确的。

我们将不胜感激!

python matplotlib annotate
1个回答
0
投票

TL;DR

x_coordinates
的用法不正确。第一次成功是因为数字从 1 变为 15。这意味着仅当值确实等于样本数时
x_coordinates = np.arange(len(items))
才会起作用。如果在第二个示例中放大到 x 2000-2014,您将找到注释(查看下图)。

Problem

此外,您的代码有一些多余的行和转换。

  • list(df[category])
    不需要
  • y_coordinates = list(df[df.columns[1]])
    x_coordinates = list(items)
    也不需要
  • 我也不明白使用
    category = df.columns[1]
    items = df[df.columns[0]]
  • 背后的原因

这里有一个更有效的方法,如果评论中有任何不清楚的地方,请询问:

df = pd.read_csv("data.csv", index_col=0) # set the first column as an index
plt.plot(df) # plot the df with respect to its' index
plt.xlabel(df.index.name) # set xlabel
plt.ylabel(df.columns[0]) # and y label
for x, y in zip(df.index, df.iloc[:,0]): # annotate values, here you can also play arround with skipping rows...
    plt.text(x, y, f"{y}", ha="center", va="bottom", fontsize=10, color="black")

对于第一个数据集:

first

第二个:

second

© www.soinside.com 2019 - 2024. All rights reserved.