Python Seaborn 条形图排序
声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow
原文地址: http://stackoverflow.com/questions/43770507/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me):
StackOverFlow
Seaborn Bar Plot Ordering
提问by Tronald Dump
I have a pandas dataframe that has two columns.
我有一个有两列的熊猫数据框。
I need the plot ordered by the "Count" Column.
我需要按“计数”列排序的图。
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()
Right now the plot is getting ordered by the "Dim" column, I need it ordered by the "Count" column,How can I do this?
采纳答案by Serenity
You have to sort your dataframe in desired way and the reindex it to make new ascending / descending index. After that you may plot bar graph with index as x values. Then set set labels by Dim column of your dataframe:
您必须以所需的方式对数据框进行排序并重新索引它以创建新的升序/降序索引。之后,您可以使用索引作为 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()
回答by Foreever
回答by Veera Srikanth
Prepare the data frame such that it is ordered by the column that you want.
准备数据框,使其按所需的列排序。
Now pass that as a parameter to function.
现在将其作为参数传递给函数。
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"]
# 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'])`