在 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
文本/注释绘制正确:
但是,给定以下输入 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
绘制如下图表:
我观察到其他数据输入的相同行为。有些会显示注释,有些则不会。我找不到关于输入数据出现问题的原因的共同点。我的代码中是否存在我忽略的错误?
使用 ax.annotate(也构建在 ax.text 之上)也会出现同样的问题:
ax.annotate(
value_label,
xy=(x_coordinate - 1, y_coordinate),
textcoords="offset points",
xytext=(0, 0),
zorder=10,
)
我尝试调试该问题,但 .text/.annotate 的所有输入值都是正确的。
我们将不胜感激!
TL;DR
x_coordinates
的用法不正确。第一次成功是因为数字从 1 变为 15。这意味着仅当值确实等于样本数时 x_coordinates = np.arange(len(items))
才会起作用。如果在第二个示例中放大到 x 2000-2014,您将找到注释(查看下图)。
此外,您的代码有一些多余的行和转换。
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")
对于第一个数据集:
第二个: