簡體   English   中英

Seaborn 條形圖排序

[英]Seaborn Bar Plot Ordering

我有一個有兩列的熊貓數據框。

我需要按“計數”列排序的圖。

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

現在情節按“昏暗”列排序,我需要按“計數”列排序,我該怎么做? 在此處輸入圖片說明

您可以為此使用 order 參數。

sns.barplot(x='Id', y="Speed", data=df, order=result['Id'])

歸功於韋恩。

查看他的其余代碼

您必須以所需的方式對數據框進行排序並重新索引它以創建新的升序/降序索引。 之后,您可以使用索引作為 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()

在此處輸入圖片說明

准備數據框,使其按所需的列排序。

現在將其作為參數傳遞給函數。

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 Bar Plot 功能,但有代碼顯示自定義洋紅色標簽,但沒有考慮使用 seaborn.barplot 函數的可選“order”參數。 因此,這是 OP 的有效答案,但特別適用於未來的訪問者。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM