在前面兩篇文章中,我們已經學習了seaborn繪圖的風格和顏色設定,從本篇文章開始,我們開始選一些有意思的資料集進行各種圖形繪製,在實踐中感受資料視覺化的魅力。本篇文章主要講2個繪圖函式,那就是繪製直方圖的函式seaborn,distplot()和繪製條形圖的函式seaborn。barplot()(關於直方圖和條形圖的區別請查閱前面matplotlib系列中的相關文章)。
處理繪圖資料
今天我們用直方圖和條形圖展示下NBA2017-2018賽季各球員薪資情況。首先,我們用pandas把資料讀寫進來,然後按薪資情況降序排序,看下NBA球員中薪資前10的球員有哪些。
#匯入需要的依賴包
%matplotlib inline
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import 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條資料結構如下圖:
前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)
NBA球員薪資排名
從條形圖中不難看出,勇士隊的當家球星庫裡薪資最高,將近達到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")
NBA各球隊薪資支付條形圖
從上面條形圖中可以看出勇士支付最高,其次是騎士!
seaborn。distplot()繪製直方圖
上面我們用條形圖對比了各球員薪資排名和球隊支付的薪資排名,接下來我們用直方圖的方式展示整個聯盟中各球員的薪資水平分佈和球隊薪資水平分佈。
#用pandas讀入資料
data=pd.read_csv('NBA_season1718_salary.csv')
#取出薪資列
salary=data['season17_18']
#繪製直方圖
sns.distplot(salary)
NBA球員2017-2018賽季薪資分佈
上面這個圖,我們沒有指定bins,所以箱子數有點多,那我們分別指定bins為3,10,30,看看效果。
sns.distplot(salary,bins=3)
sns.distplot(salary,bins=10)
sns.distplot(salary,bins=30)
bins=3
bins=10
bins=30
對於上面的圖,橫座標表示薪資範圍,縱座標表示每個球員薪資所佔頻數。下面我們彙總球隊薪資,並繪製直方圖。
#按球隊彙總求和並重新設定index
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.distplot(salary_sum)
NBA各球隊薪資分佈圖
這裡預設分了2個範圍,大家知道有30只球隊,那麼我們設定bins=30,看看效果:
sns。distplot(salary_sum,bins=30)
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(中等)佔的比重最大,這也是符合實際情況的,不可能所有的球隊都像快船一樣有錢!好了,關於條形圖和直方圖到此為止,下次繼續散點圖繪製,感謝閱讀。