在 seaborn 散点图中对分类 x 轴进行排序
Sort categorical x-axis in a seaborn scatter plot
我正在尝试使用 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 轴上的那个标签,以及给定的顺序,如下所示:
这意味着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')
输出是
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.scatterplot 中可用的额外参数而不是 sns.strpplot 的人(变量的大小和样式映射),可以简单地通过排序来设置 x 轴的顺序在将数据框传递给 seaborn 之前。以下将按字母顺序排序。
df.sort_values(feature)
我正在尝试使用 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 轴上的那个标签,以及给定的顺序,如下所示:
这意味着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')
输出是
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.scatterplot 中可用的额外参数而不是 sns.strpplot 的人(变量的大小和样式映射),可以简单地通过排序来设置 x 轴的顺序在将数据框传递给 seaborn 之前。以下将按字母顺序排序。
df.sort_values(feature)