2017-05-03 65 views
3

我有一个有两列的熊猫数据框。Seaborn条形图订购

我需要按“计数”列排序的图。

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() 

现在情节是由“昏暗”列有序,我需要它按“计数”列排序,我该怎么做? enter image description here

+1

你看过了'barplot'的文档?它需要一个名为'order'的参数。所以你可以按你的“Count”列进行排序,并将生成的Dim值传递给它。 –

回答

2

您必须按照所需的方式对数据帧进行排序,并使其重新索引以创建新的升序/降序索引。之后,您可以绘制索引为x值的条形图。然后设置标签集中你的数据框的点心列:

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(['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() 

enter image description here

+0

我是否正确地理解了它 - 即使我已经对数据框进行了排序,我也必须首先使用索引作为标签来创建它,以确保sns不会根据标签名称按字母顺序对条形图进行排序(并且无法传递,例如' sorted = False',为了避免这种情况)? – Rotkiv

+0

我想你必须测试它 – Serenity