Seaborn 条形图排序
Seaborn Bar Plot Ordering
我有一个包含两列的 pandas 数据框。
我需要按 "Count" 列排序的情节。
dicti=({'37':99943,'25':47228,'36':16933,'40':14996,'35':11791,'34':8030,'24' : 6319 ,'2' :5055 ,'39' :4758 ,'38' :4611 })
pd_df = pd.DataFrame(list(dicti.iteritems()))
pd_df.columns =["Dim","Count"]
plt.figure(figsize=(12,8))
ax = sns.barplot(x="Dim", y= "Count",data=pd_df )
ax.get_yaxis().set_major_formatter(plt.FuncFormatter(lambda x, loc: "
{:,}".format(int(x))))
ax.set(xlabel="Dim", ylabel='Count')
for item in ax.get_xticklabels():
item.set_rotation(90)
for i, v in enumerate(pd_df["Count"].iteritems()):
ax.text(i ,v[1], "{:,}".format(v[1]), color='m', va ='bottom',
rotation=45)
plt.tight_layout()
现在剧情正在按 "Dim" 列排序,我需要按 "Count" 列排序,我该怎么做?
您必须按所需方式对数据框进行排序,并重新编制索引以创建新的升序/降序索引。之后,您可以绘制带有索引作为 x 值的条形图。然后通过数据框的 Dim 列设置标签:
import matplotlib.pylab as plt
import pandas as pd
import seaborn as sns
dicti=({'37':99943,'25':47228,'36':16933,'40':14996,'35':11791,'34':8030,'24' : 6319 ,'2' :5055 ,'39' :4758 ,'38' :4611 })
pd_df = pd.DataFrame(list(dicti.items()))
pd_df.columns =["Dim","Count"]
print (pd_df)
# sort df by Count column
pd_df = pd_df.sort_values(['Count']).reset_index(drop=True)
print (pd_df)
plt.figure(figsize=(12,8))
# plot barh chart with index as x values
ax = sns.barplot(pd_df.index, pd_df.Count)
ax.get_yaxis().set_major_formatter(plt.FuncFormatter(lambda x, loc: "{:,}".format(int(x))))
ax.set(xlabel="Dim", ylabel='Count')
# add proper Dim values as x labels
ax.set_xticklabels(pd_df.Dim)
for item in ax.get_xticklabels(): item.set_rotation(90)
for i, v in enumerate(pd_df["Count"].iteritems()):
ax.text(i ,v[1], "{:,}".format(v[1]), color='m', va ='bottom', rotation=45)
plt.tight_layout()
plt.show()
您可以为此使用订单参数。
sns.barplot(x='Id', y="Speed", data=df, order=result['Id'])
感谢韦恩。
查看他的其余部分 code。
这个 link 对我仍然有效。但是,为了方便起见,我在这里粘贴了作者的代码。
result = df.groupby(["Id"])['Speed'].aggregate(np.median).reset_index().sort_values('Speed')
sns.barplot(x='Id', y="Speed", data=df, order=result['Id'])
plt.show()
df
Id Speed
0 1 30
1 1 35
2 1 31
3 2 20
4 2 25
结果
Id Speed
1 2 22.5
0 1 31.0
2 3 80.0
准备数据框,使其按所需列排序。
现在将其作为参数传递给函数。
import pandas as pd
import seaborn as sns
dicti=({'37': 99943,'25': 47228,'36': 16933,'40': 14996,'35': 11791,'34': 8030,'24': 6319 ,'2': 5055 ,'39': 4758 ,'38' :4611})
pd_df = pd.DataFrame(list(dicti.items()))
pd_df.columns =["Dim", "Count"]
# Here the dataframe is already sorted if not use the below line
# pd_df = pd_df.sort_values('Count').reset_index()
# or
# pd_df = pd_df.sort_values('Count',ascending=False).reset_index()
sns.barplot(x='Dim', y='Count', data=pd_df, order=pd_df['Dim'])`
要进行特定订单,我建议创建一个列表,然后按它进行排序:
order_list = ['first', 'second', 'third']
sns.barplot(x=df['x'], y=df['y'], order=order_list)
您可以使用以下代码
import seaborn as sns
iris = sns.load_dataset("iris")
order = iris.groupby(["species"])["sepal_width"].mean().sort_values().index
sns.barplot(x="species", y="sepal_width", data=iris, order=order)
如果要将它们从大到小排序,请指定 ascending=False
。
order = iris.groupby(["species"])["sepal_width"].mean().sort_values(ascending=False).index
试试用这个。无需对数据框进行排序或创建额外的列表。
import pandas as pd
import seaborn as sns
import matplotlib.pyplot as plt
dicti=({'34':8030,'37':99943,'38':4611,'25':47228,'39':4758,'36':16933,'2':5055,'40':14996,'24':6319,'35':11791})
pd_df = pd.DataFrame(list(dicti.items()))
pd_df.columns =["Dim","Count"]
plt.figure(figsize=(12,8))
ax = sns.barplot(x="Dim", y= "Count",data=pd_df, order=pd_df.sort_values(by=['Count'], ascending=False).set_index('Dim').index)
ax.get_yaxis().set_major_formatter(plt.FuncFormatter(lambda x, loc: "{:,}".format(int(x))))
ax.set(xlabel="Dim", ylabel='Count')
for item in ax.get_xticklabels():
item.set_rotation(90)
#for i, v in enumerate(pd_df["Count"].iteritems()):
# ax.text(i ,v[1], "{:,}".format(v[1]), color='m', va ='bottom',
# rotation=45)
plt.tight_layout()
注意:您可能会注意到有 3 行代码已转为注释。这是因为 @Tronald Dump
专门询问了 Seaborn 条形图的功能,但是有代码显示自定义洋红色标签,但没有考虑 seaborn.barplot 函数的可选“order”参数的使用。因此,这可以作为 OP 的有效答案,但特别适用于未来的访问者。
我有一个包含两列的 pandas 数据框。
我需要按 "Count" 列排序的情节。
dicti=({'37':99943,'25':47228,'36':16933,'40':14996,'35':11791,'34':8030,'24' : 6319 ,'2' :5055 ,'39' :4758 ,'38' :4611 })
pd_df = pd.DataFrame(list(dicti.iteritems()))
pd_df.columns =["Dim","Count"]
plt.figure(figsize=(12,8))
ax = sns.barplot(x="Dim", y= "Count",data=pd_df )
ax.get_yaxis().set_major_formatter(plt.FuncFormatter(lambda x, loc: "
{:,}".format(int(x))))
ax.set(xlabel="Dim", ylabel='Count')
for item in ax.get_xticklabels():
item.set_rotation(90)
for i, v in enumerate(pd_df["Count"].iteritems()):
ax.text(i ,v[1], "{:,}".format(v[1]), color='m', va ='bottom',
rotation=45)
plt.tight_layout()
现在剧情正在按 "Dim" 列排序,我需要按 "Count" 列排序,我该怎么做?
您必须按所需方式对数据框进行排序,并重新编制索引以创建新的升序/降序索引。之后,您可以绘制带有索引作为 x 值的条形图。然后通过数据框的 Dim 列设置标签:
import matplotlib.pylab as plt
import pandas as pd
import seaborn as sns
dicti=({'37':99943,'25':47228,'36':16933,'40':14996,'35':11791,'34':8030,'24' : 6319 ,'2' :5055 ,'39' :4758 ,'38' :4611 })
pd_df = pd.DataFrame(list(dicti.items()))
pd_df.columns =["Dim","Count"]
print (pd_df)
# sort df by Count column
pd_df = pd_df.sort_values(['Count']).reset_index(drop=True)
print (pd_df)
plt.figure(figsize=(12,8))
# plot barh chart with index as x values
ax = sns.barplot(pd_df.index, pd_df.Count)
ax.get_yaxis().set_major_formatter(plt.FuncFormatter(lambda x, loc: "{:,}".format(int(x))))
ax.set(xlabel="Dim", ylabel='Count')
# add proper Dim values as x labels
ax.set_xticklabels(pd_df.Dim)
for item in ax.get_xticklabels(): item.set_rotation(90)
for i, v in enumerate(pd_df["Count"].iteritems()):
ax.text(i ,v[1], "{:,}".format(v[1]), color='m', va ='bottom', rotation=45)
plt.tight_layout()
plt.show()
您可以为此使用订单参数。
sns.barplot(x='Id', y="Speed", data=df, order=result['Id'])
感谢韦恩。
查看他的其余部分 code。
这个 link 对我仍然有效。但是,为了方便起见,我在这里粘贴了作者的代码。
result = df.groupby(["Id"])['Speed'].aggregate(np.median).reset_index().sort_values('Speed')
sns.barplot(x='Id', y="Speed", data=df, order=result['Id'])
plt.show()
df
Id Speed
0 1 30
1 1 35
2 1 31
3 2 20
4 2 25
结果
Id Speed
1 2 22.5
0 1 31.0
2 3 80.0
准备数据框,使其按所需列排序。
现在将其作为参数传递给函数。
import pandas as pd
import seaborn as sns
dicti=({'37': 99943,'25': 47228,'36': 16933,'40': 14996,'35': 11791,'34': 8030,'24': 6319 ,'2': 5055 ,'39': 4758 ,'38' :4611})
pd_df = pd.DataFrame(list(dicti.items()))
pd_df.columns =["Dim", "Count"]
# Here the dataframe is already sorted if not use the below line
# pd_df = pd_df.sort_values('Count').reset_index()
# or
# pd_df = pd_df.sort_values('Count',ascending=False).reset_index()
sns.barplot(x='Dim', y='Count', data=pd_df, order=pd_df['Dim'])`
要进行特定订单,我建议创建一个列表,然后按它进行排序:
order_list = ['first', 'second', 'third']
sns.barplot(x=df['x'], y=df['y'], order=order_list)
您可以使用以下代码
import seaborn as sns
iris = sns.load_dataset("iris")
order = iris.groupby(["species"])["sepal_width"].mean().sort_values().index
sns.barplot(x="species", y="sepal_width", data=iris, order=order)
如果要将它们从大到小排序,请指定 ascending=False
。
order = iris.groupby(["species"])["sepal_width"].mean().sort_values(ascending=False).index
试试用这个。无需对数据框进行排序或创建额外的列表。
import pandas as pd
import seaborn as sns
import matplotlib.pyplot as plt
dicti=({'34':8030,'37':99943,'38':4611,'25':47228,'39':4758,'36':16933,'2':5055,'40':14996,'24':6319,'35':11791})
pd_df = pd.DataFrame(list(dicti.items()))
pd_df.columns =["Dim","Count"]
plt.figure(figsize=(12,8))
ax = sns.barplot(x="Dim", y= "Count",data=pd_df, order=pd_df.sort_values(by=['Count'], ascending=False).set_index('Dim').index)
ax.get_yaxis().set_major_formatter(plt.FuncFormatter(lambda x, loc: "{:,}".format(int(x))))
ax.set(xlabel="Dim", ylabel='Count')
for item in ax.get_xticklabels():
item.set_rotation(90)
#for i, v in enumerate(pd_df["Count"].iteritems()):
# ax.text(i ,v[1], "{:,}".format(v[1]), color='m', va ='bottom',
# rotation=45)
plt.tight_layout()
注意:您可能会注意到有 3 行代码已转为注释。这是因为 @Tronald Dump
专门询问了 Seaborn 条形图的功能,但是有代码显示自定义洋红色标签,但没有考虑 seaborn.barplot 函数的可选“order”参数的使用。因此,这可以作为 OP 的有效答案,但特别适用于未来的访问者。