在多线图上为每列注释数据点

Annotate data points for each column on multi-line plot

我有一个包含多列的数据框(列代表月份),每一行都是一个组,例如

    OCT20  NOV20  DEC20  JAN21
A   20     24     19     18
B   45     29     33     46
C   19     11     13     11

(这只是获得可重现解决方案的虚拟数据)。

我正在绘制此数据框的线图,其中列作为 x 刻度,索引中的每一行作为图中的一条线,每行每个月的值是 y 值。

下面是我用来绘图的代码,效果很好。但是,我想用数据框中的值注释每个数据点,但是使用下面的代码我将所有数据点放在一个地方。

%matplotlib inline

labels = ['OCT20', 'NOV20', 'DEC20', 'JAN21', 'FEB21', 'MAR21']

ax = df.T.plot(grid = True, figsize=(20,15), marker='o')

for col in df.columns:
    for id, val in enumerate(df[col]):
        ax.text(id, val, str(val))

x = [0,1,2,3,4,5]
plt.xticks(x, labels, rotation=45)
    
plt.show()

输出是这样的:

但我希望每个数据点都对应于图中的正确标记。

有人知道如何解决这个问题吗?

你太接近了!您已转置 DataFrame,但随后尝试通过 un-transposed DataFrame df:

应用文本
plot_df = df.T  # Save the Transposition
ax = plot_df.plot(grid=True, figsize=(20, 15), marker='o')

for col in plot_df.columns:  # Use the Transposition
    for idx, val in enumerate(plot_df[col]):
        ax.text(idx, val, str(val))

x = [0, 1, 2, 3]
labels = ['OCT20', 'NOV20', 'DEC20', 'JAN21']
plt.xticks(x, labels, rotation=45)


使用的数据帧:

df = pd.DataFrame({
    'OCT20': {'A': 20, 'B': 45, 'C': 19},
    'NOV20': {'A': 24, 'B': 29, 'C': 11},
    'DEC20': {'A': 19, 'B': 33, 'C': 13},
    'JAN21': {'A': 18, 'B': 46, 'C': 11}
})