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

3
我正在尝试使用 seaborn 散点图绘制数据框中前 30% 的值,如下所示。

enter image description here

相同绘图的可重复代码:
import seaborn as sns

df = sns.load_dataset('iris')

#function to return top 30 percent values in a dataframe.
def extract_top(df):
    n = int(0.3*len(df))
    top = df.sort_values('sepal_length', ascending = False).head(n)

    return top

#storing the top values
top = extract_top(df)

#plotting
sns.scatterplot(data = top,
                x='species', y='sepal_length', 
                color = 'black',
                s = 100,
                marker = 'x',)

这里,我想按照 order = ['virginica', 'setosa', 'versicolor'] 的顺序对x轴进行排序。当我尝试在 sns.scatterplot() 的参数中使用 order 时,它返回一个错误 AttributeError: 'PathCollection' object has no property 'order'。正确的做法是什么?

请注意:在数据框中,setosa 也是 species 中的一个类别,但在前30%的值中没有一个值属于该类别。因此,在示例输出中,该标签未显示出来。但是我希望即使是那个标签也按照给定的顺序显示在x轴上,如下所示:

enter image description here

3个回答

9

scatterplot() 并不是正确的工具。由于你有一个分类轴,你应该使用 stripplot() 而不是 scatterplot()。在这里可以看到关系和分类绘图之间的差异:https://seaborn.pydata.org/api.html

sns.stripplot(data = top,
              x='species', y='sepal_length', 
              order = ['virginica','setosa','versicolor'],
              color = 'black', jitter=False)

enter image description here


非常感谢。然而,为什么在sns.stripplot()中使用marker=时没有显示出'+'或'x'标记呢? - Gun
我正在调查这个问题,我已经回答了你的另一个问题。 - Diziet Asahi

1
这意味着sns.scatterplot()不会将order作为其args之一。对于物种setosa,您可以使用alpha隐藏散点,同时保留刻度线。
import seaborn as sns

df = sns.load_dataset('iris')

#function to return top 30 percent values in a dataframe.
def extract_top(df):
    n = int(0.3*len(df))
    top = df.sort_values('sepal_length', ascending = False).head(n)

    return top

#storing the top values
top = extract_top(df)
top.append(top.iloc[0,:])
top.iloc[-1,-1] = 'setosa'
order = ['virginica','setosa','versicolor']

#plotting
for species in order:
    alpha = 1 if species != 'setosa' else 0
    sns.scatterplot(x="species", y="sepal_length",
                    data=top[top['species']==species],
                    alpha=alpha,
                    marker='x',color='k')

输出结果为

output


我编辑了问题,请查看并建议您的代码进行更改。 - Gun
感谢更新。但是,如果 order = [ 'virginica','setosa','versicolor'] 呢?在上面的代码中,它为一个类别变量留出一个空格,并继续显示散点图,但实际上不是基于 x 轴绘制的。 - Gun
不如每次都玩'xticks',是否可以在scatterplot()或其他方式中默认设置它?因为如果有许多类别可用并且必须绘制许多图,则在现实中将会很困难。 - Gun
@Ganesh 谢谢你提出这个问题,我以前从未考虑过这些,是的,你可以看看我的更新帖子。 - meTchaikovsky

0

对于希望在sns.scatterplot中利用额外参数(变量的大小和样式映射)而不是sns.strpplot的人来说,可以通过在将数据集传递给seaborn之前对其进行排序来简单设置x轴的顺序。以下方法会按字母顺序进行排序。

df.sort_values(feature)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接