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

Posted

技术标签:

【中文标题】使用 seaborn 在 x y 散点图中添加标签【英文标题】:Adding labels in x y scatter plot with seaborn 【发布时间】:2022-01-18 00:48:51 【问题描述】:

我花了几个小时来尝试做我认为很简单的任务,即在使用 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')

我想在图中的每个点上添加“物种”列中的文本。

我见过很多使用 matplotlib 但不使用 seaborn 的示例。

有什么想法吗?谢谢。

【问题讨论】:

您能提供一个示例数据框吗? z 是否包含 X 轴和 Y 轴的标签信息?您要标记整个轴还是轴刻度线? Seaborn 在后台使用 Matplotlib - 你是说你不想使用 plt 方法,而只是使用 sns 方法来标记你的地块? 添加了样本数据集。对不起 【参考方案1】:

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

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())  

【讨论】:

谢谢斯科特。它确实绘图,但对我来说,绘制的字符串看起来很奇怪。每一点都说明了以下内容:“物种:setosa,名称:3,dtype:对象”知道如何解决这个问题吗?【参考方案2】:

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

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')

【讨论】:

此逻辑假设(通过遍历 data[x][line] 的迭代器行)数据帧具有递增索引,没有任何间隙。例如,对于过滤的数据帧,这将不是真的。该函数将引发 KeyError。 用户可以通过传递df.reset_index(drop=True)而不是原始df来解决这个问题。【参考方案3】:

感谢其他 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: https://***.com/a/54789170/2641825"""
    # 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

使用函数如下:

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)')

另请参阅此答案以了解如何使用返回绘图的函数: https://***.com/a/43926055/2641825

【讨论】:

此逻辑假设(通过循环迭代器 linedata[x][line])数据帧具有递增索引,没有任何间隙。例如,对于过滤的数据帧,这将不是真的。该函数将引发 KeyError。 用户可以通过传递df.reset_index(drop=True)而不是原始df来解决这个问题。

以上是关于使用 seaborn 在 x y 散点图中添加标签的主要内容,如果未能解决你的问题,请参考以下文章

seaborn可视化散点图并自定义数据轴标签指定标签文本的大小(X轴和Y轴的轴标签,Change X & Y Axis Label Size in a Seaborn Plot)

seaborn可视化散点图并自定义数据轴标签(X轴和Y轴的轴标签,Change X & Y Axis Labels to a Seaborn Plot)

在 seaborn 散点图中对分类 x 轴进行排序

在 ggplotly 散点图中添加自定义数据标签

如何使用R中的绘图功能更改散点图中x轴和y轴标签的字体大小和颜色?

如何在 seaborn FacetGrid 中格式化 y 轴或 x 轴标签