在前面兩篇文章中,我們已經學習了seaborn繪圖的風格和顏色設置,從本篇文章開始,我們開始選一些有意思的數據集進行各種圖形繪製,在實踐中感受數據可視化的魅力。本篇文章主要講2個繪圖函數,那就是繪製直方圖的函數seaborn,distplot()和繪製條形圖的函數seaborn.barplot()(關於直方圖和條形圖的區別請查閱前面matplotlib系列中的相關文章)。
處理繪圖數據
今天我們用直方圖和條形圖展示下NBA2017-2018賽季各球員薪資情況。首先,我們用pandas把數據讀寫進來,然後按薪資情況降序排序,看下NBA球員中薪資前10的球員有哪些。
#導入需要的依賴包%matplotlib inlineimport numpy as npimport pandas as pdimport matplotlib.pyplot as pltimport seaborn as sns#讀入數據data=pd.read_csv('NBA_season1718_salary.csv')#對讀進來的數據按薪資降序排序並取前10條數據salary_top10=(data.sort_values("season17_18",ascending=False)).head(10)#取出球員列數據,作為條形圖橫坐標player=salary_top10['Player']#取出球員薪資列,作為條形圖縱坐標season_salary=salary_top10['season17_18'] 前10條數據結構如下圖:
用seaborn.barplot()繪製條形圖
用seaborn.barplot()函數可以繪製條形圖,如果不傳入任何參數,會繪製出一個坐標軸,如圖:
sns.barplot()
現在,我們將球員數據作為橫坐標,球員薪資作為縱坐標,繪製出條形圖。
plt.figure(figsize=(10,6))plt.xticks(rotation=45)plt.ylim(season.min() * 0.5, season.max() * 1.01)#ci參數表示允許的誤差範圍(控制誤差棒的百分比,在0-100之間)sns.barplot(x=player,y=season,data=salary_top10,ci=68)
從條形圖中不難看出,勇士隊的當家球星庫裡薪資最高,將近達到3500萬美元,位居第二的是勒布朗詹姆斯,也是在3300萬美元以上。上面的條形圖是按球員作為橫坐標,下面我們按球隊匯總,看看哪個球隊的薪資總額最高。
salary_by_team=data.groupby(by='Tm').sum().reset_index()salary_by_team=salary_by_team.sort_values(by='season17_18',ascending=False)tm_top10=salary_by_team[0:10]tm=tm_top10['Tm']salary_sum=tm_top10['season17_18']sns.barplot(tm,salary_sum,data=tm_top10)sns.color_palette('hls',10)sns.set(style="whitegrid")
從上麵條形圖中可以看出勇士支付最高,其次是騎士!
seaborn.distplot()繪製直方圖
上面我們用條形圖對比了各球員薪資排名和球隊支付的薪資排名,接下來我們用直方圖的方式展示整個聯盟中各球員的薪資水平分布和球隊薪資水平分布。
#用pandas讀入數據data=pd.read_csv('NBA_season1718_salary.csv')#取出薪資列salary=data['season17_18']#繪製直方圖sns.distplot(salary)
上面這個圖,我們沒有指定bins,所以箱子數有點多,那我們分別指定bins為3,10,30,看看效果。
sns.distplot(salary,bins=3)sns.distplot(salary,bins=10)sns.distplot(salary,bins=30)
對於上面的圖,橫坐標表示薪資範圍,縱坐標表示每個球員薪資所佔頻數。下面我們匯總球隊薪資,並繪製直方圖。
#按球隊匯總求和並重新設置indexsalary_by_team=data.groupby(by='Tm').sum().reset_index()#按薪資升序排序salary_by_team=salary_by_team.sort_values(by='season17_18',ascending=False)tm_top10=salary_by_team[0:10]tm=tm_top10['Tm']salary_sum=tm_top10['season17_18']sns.distplot(salary_sum)
這裡默認分了2個範圍,大家知道有30隻球隊,那麼我們設置bins=30,看看效果:
sns.distplot(salary_sum,bins=30)
可以從圖中看出,大部分球隊的薪資總額在1.2-1.3億美元左右。下面我們對球隊薪資總額進行處理,找出樣本的上四分位、下四分位,並以此作為標準,將薪資總額分為3個等級(low:0、mid:1、high:2)。
#對球隊薪資總額按降序順序排序並重設索引salary_by_team=salary_by_team.sort_values(by='season17_18',ascending=True).reset_index()#統計球隊個數cnt=salary_by_team['Tm'].count()Q3=int((3*(cnt+1)/4))Q1=int(((cnt+1)/4))#分別求出下四分位和上四分位,作為判斷薪資水平的標準,低於下四分位的為低,高於上四分位的為高,中間為中等
Q1_value=salary_by_team.at[Q1,'season17_18']Q3_value=salary_by_team.at[Q3,'season17_18']然後,自定義一個分類函數,將薪資連續數值離散化:
def which_class(i):if i<Q1_value: return 0 elif i<Q3_value and i>Q1_value: return 1 else: return 2然後用pandas的apply函數,處理連續值:#新增level列,並將處理的值添加到新增列中
salary_by_team['level']=salary_by_team['season17_18'].apply(which_class)
#用等級數據繪製直方圖: sns.distplot(salary_by_team['level'])
從圖中可以發現,等級為1(中等)佔的比重最大,這也是符合實際情況的,不可能所有的球隊都像快船一樣有錢!好了,關於條形圖和直方圖到此為止,下次繼續散點圖繪製,感謝閱讀。