在Seaborn线图(sns)上注释标记值

时间:2019-11-22 09:26:23

标签: pandas matplotlib jupyter-notebook data-visualization seaborn

有没有办法在Seaborn线图上标注标记值?

这是我的实际线条图:

a4_dims = (20, 10)
fig, ax = plt.subplots(figsize=a4_dims)
p1 = sns.lineplot(x='NBags', y='value', hue='variable', style="variable", markers=True, dashes=False, 
             data=pd.melt(df_knn1, ['NBags']))

enter image description here

这就是我想要的: enter image description here

每个标记上的数字值是该行上标记本身的值。

1 个答案:

答案 0 :(得分:0)

是的,可以使用ax.text(...),默认情况下带注释的文本颜色为黑色。如果您想对标签进行颜色分组,那么一种可能的方法是按照以下步骤进行ax.text(...)循环(使用您的预定义调色板)

导入库并创建示例数据框

import seaborn as sns
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt

np.random.seed(12345)
x = np.random.rand(15,3)
y = np.random.binomial(2, 0.5, (15,1))
z = np.concatenate((x,y),axis=1)

df = pd.DataFrame(z,columns=['x','y','mark_value','label'])
df['label'] = df['label'].astype(int)
print(df)
#            x         y  mark_value  label
# 0   0.929616  0.316376    0.183919      1
# 1   0.204560  0.567725    0.595545      1
# 2   0.964515  0.653177    0.748907      1
# 3   0.653570  0.747715    0.961307      1
# 4   0.008388  0.106444    0.298704      0
# 5   0.656411  0.809813    0.872176      1
# 6   0.964648  0.723685    0.642475      0
# 7   0.717454  0.467599    0.325585      2
# 8   0.439645  0.729689    0.994015      2
# 9   0.676874  0.790823    0.170914      1
# 10  0.026849  0.800370    0.903723      0
# 11  0.024676  0.491747    0.526255      1
# 12  0.596366  0.051958    0.895090      1
# 13  0.728266  0.818350    0.500223      2
# 14  0.810189  0.095969    0.218950      2

绘图代码

a4_dims = (20, 10)
fig, ax = plt.subplots(figsize=a4_dims)

palette = ['r','b','g']

p1 = sns.lineplot(x='x', y='y', hue='label', style='label', markers=True, dashes=False, 
             data=df, palette=palette)

for item, color in zip(df.groupby('label'),palette):
    #item[1] is a grouped data frame
    for x,y,m in item[1][['x','y','mark_value']].values:
        ax.text(x,y,f'{m:.2f}',color=color)

输出 enter image description here