【问题标题】:Sort categorical x-axis in a seaborn scatter plot在 seaborn 散点图中对分类 x 轴进行排序
【发布时间】:2021-02-22 00:37:04
【问题描述】:

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

同一情节的可重现代码:

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 轴进行排序。当我尝试使用order 作为sns.scatterplot() 中的参数之一时,它返回了错误AttributeError: 'PathCollection' object has no property 'order'。正确的做法是什么?

请注意:在数据框中,setosa 也是species 中的一个类别,但是,在前 30% 的值中,其值没有下降。因此,该标签未显示在顶部可重现代码的示例输出中。但我什至想要 x 轴上的标签,以及如下所示的给定顺序:

【问题讨论】:

    标签: python pandas matplotlib seaborn scatter-plot


    【解决方案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')
    

    输出是

    【讨论】:

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

    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)
    

    【讨论】:

    • 非常感谢。但是,为什么在sns.stripplot() 中不显示带有marker= 的标记“+”或“x”?
    • 我正在调查这个,我回答了你的另一个问题。
    【解决方案3】:

    对于那些想要使用 sns.scatterplot 中可用的额外参数而不是 sns.strpplot(变量的大小和样式映射)的人,可以通过在将数据帧传递给之前对数据帧进行排序来简单地设置 x 轴的顺序海运。以下将按字母顺序排序。

    df.sort_values(feature)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-02-22
      • 2017-10-19
      • 1970-01-01
      • 2021-03-05
      • 1970-01-01
      • 2011-11-17
      • 2020-12-09
      • 1970-01-01
      相关资源
      最近更新 更多