使用seaborn在xy散点图中添加标签

Tre*_*eha 13 python plot seaborn

我花了好几个小时试图做我认为是一项简单的任务,即在使用seaborn时将标签添加到XY图上.

这是我的代码

import seaborn as sns
import matplotlib.pyplot as plt
%matplotlib inline

df_iris=sns.load_dataset("iris") 

sns.lmplot('sepal_length', # Horizontal axis
           'sepal_width', # Vertical axis
           data=df_iris, # Data source
           fit_reg=False, # Don't fix a regression line
           size = 8,
           aspect =2 ) # size and dimension

plt.title('Example Plot')
# Set x-axis label
plt.xlabel('Sepal Length')
# Set y-axis label
plt.ylabel('Sepal Width')
Run Code Online (Sandbox Code Playgroud)

我想在图中的每个点添加"种类"栏中的文字.

我见过许多使用matplotlib但不使用seaborn的例子.

有任何想法吗?谢谢.

Sco*_*ton 25

您可以这样做的一种方法如下:

import seaborn as sns
import matplotlib.pyplot as plt
import pandas as pd
%matplotlib inline

df_iris=sns.load_dataset("iris") 

ax = sns.lmplot('sepal_length', # Horizontal axis
           'sepal_width', # Vertical axis
           data=df_iris, # Data source
           fit_reg=False, # Don't fix a regression line
           size = 10,
           aspect =2 ) # size and dimension

plt.title('Example Plot')
# Set x-axis label
plt.xlabel('Sepal Length')
# Set y-axis label
plt.ylabel('Sepal Width')


def label_point(x, y, val, ax):
    a = pd.concat({'x': x, 'y': y, 'val': val}, axis=1)
    for i, point in a.iterrows():
        ax.text(point['x']+.02, point['y'], str(point['val']))

label_point(df_iris.sepal_length, df_iris.sepal_width, df_iris.species, plt.gca())  
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述


com*_*Bio 17

这是一个更新的答案,不受评论中描述的字符串问题的影响。

import seaborn as sns
import matplotlib.pyplot as plt
%matplotlib inline

df_iris=sns.load_dataset("iris") 

plt.figure(figsize=(20,10))
p1 = sns.scatterplot('sepal_length', # Horizontal axis
       'sepal_width', # Vertical axis
       data=df_iris, # Data source
       size = 8,
       legend=False)  

for line in range(0,df_iris.shape[0]):
     p1.text(df_iris.sepal_length[line]+0.01, df_iris.sepal_width[line], 
     df_iris.species[line], horizontalalignment='left', 
     size='medium', color='black', weight='semibold')

plt.title('Example Plot')
# Set x-axis label
plt.xlabel('Sepal Length')
# Set y-axis label
plt.ylabel('Sepal Width')
Run Code Online (Sandbox Code Playgroud)

在此处输入图片说明


Pau*_*eux 7

感谢其他 2 个答案,这里有一个函数scatter_text可以多次重复使用这些图。

import seaborn as sns
import matplotlib.pyplot as plt

def scatter_text(x, y, text_column, data, title, xlabel, ylabel):
    """Scatter plot with country codes on the x y coordinates
       Based on this answer: /sf/answers/3835241931/"""
    # Create the scatter plot
    p1 = sns.scatterplot(x, y, data=data, size = 8, legend=False)
    # Add text besides each point
    for line in range(0,data.shape[0]):
         p1.text(data[x][line]+0.01, data[y][line], 
                 data[text_column][line], horizontalalignment='left', 
                 size='medium', color='black', weight='semibold')
    # Set title and axis labels
    plt.title(title)
    plt.xlabel(xlabel)
    plt.ylabel(ylabel)
    return p1
Run Code Online (Sandbox Code Playgroud)

使用该函数如下:

df_iris=sns.load_dataset("iris") 
plt.figure(figsize=(20,10))
scatter_text('sepal_length', 'sepal_width', 'species',
             data = df_iris, 
             title = 'Iris sepals', 
             xlabel = 'Sepal Length (cm)',
             ylabel = 'Sepal Width (cm)')
Run Code Online (Sandbox Code Playgroud)

另请参阅有关如何使用返回绘图的函数的答案:https : //stackoverflow.com/a/43926055/2641825

  • 该逻辑假设(通过通过“data[x][line]”循环迭代器“line”)数据帧具有递增索引,没有任何间隙。例如,对于过滤后的数据帧,情况并非如此。该函数将引发 KeyError。 (2认同)

Mac*_*ski 6

Use the powerful declarative API to avoid loops (seaborn>=0.12).

Specifically, put x,y, and annotations into a pandas data frame and call plotting.

Here is an example from my own research work.

import seaborn.objects as so
import pandas as pd
import matplotlib.pyplot as plt

df = pd.DataFrame(..,columns=['phase','P(X=1)','text'])

fig,ax = plt.subplots()
    p = so.Plot(df,x='phase',y='P(X=1)',text='text').add(so.Dot(marker='+')).add(so.Text(halign='left'))
    p.on(ax).show()
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述