厲害了,Matplotlib還能這樣畫散點(diǎn)圖!

在數(shù)據(jù)可視化中,二維散點(diǎn)圖的應(yīng)用范圍很廣,比如用來(lái)觀測(cè)兩個(gè)變量之間的相關(guān)性、展示銷量的的走勢(shì)等等,這些是散點(diǎn)圖的常規(guī)用法。
然而,這篇文章想講的是,二維散點(diǎn)圖能夠展現(xiàn)的信息遠(yuǎn)不止兩個(gè)維度。Matplotlib進(jìn)階繪圖的第二篇文章,帶你扒一扒散點(diǎn)圖都有哪些妙用。
本文用的數(shù)據(jù)集是加州房產(chǎn)價(jià)格數(shù)據(jù)集,每個(gè)樣本代表一個(gè)街區(qū)。數(shù)據(jù)集中共有10個(gè)屬性,包含經(jīng)度、緯度、房屋年齡中位數(shù)、總房間數(shù)、總臥室數(shù)、人口數(shù)、家庭數(shù)、收入中位數(shù)、房屋價(jià)值中位數(shù)和該地區(qū)離大海的距離。

首先,將經(jīng)度視為x,緯度作為y,繪制散點(diǎn)圖,我們可以得到這些街區(qū)的地理位置分布圖。
import?pandas?as?pd
import?matplotlib.pyplot?as?plt
%matplotlib?inline
plt.rcParams['font.sans-serif']?=?'SimHei'
plt.rcParams['axes.unicode_minus']?=?False
data?=?pd.read_csv('./data/housing.csv')
fig,ax?=?plt.subplots(figsize=(9,6))
ax.scatter(x='longitude',y='latitude',data=data)

散點(diǎn)圖大致的勾勒出了加州的地理輪廓,一個(gè)點(diǎn)代表了一個(gè)街區(qū)。
但這張圖反映不出街區(qū)之間的密集程度,原因在于,一個(gè)街區(qū)的面積相對(duì)于一個(gè)州的面積而言幾乎可以忽略不計(jì),所以很多時(shí)候兩個(gè)街區(qū)在經(jīng)緯度上相差不大,在圖上的表現(xiàn)就是重疊成一個(gè)點(diǎn)。
針對(duì)這個(gè)問(wèn)題,可以設(shè)置alpha參數(shù),控制散點(diǎn)的透明度,設(shè)置了透明度之后,顏色越深的部分就代表了越多的散點(diǎn)在這里重疊,即該區(qū)域的街區(qū)密集程度更大,如下
fig,ax?=?plt.subplots(figsize=(9,6))
#?alpha取值在0-1之間,具體取何值取決于對(duì)密集程度的定義,這里取0.3
ax.scatter(x='longitude',y='latitude',data=data,alpha=0.3)

所以通過(guò)alpha(透明度)的設(shè)置,在散點(diǎn)圖上非常直觀地展示了街區(qū)密集程度這一信息。
接著,我們可以看看各個(gè)街區(qū)的人口分布情況,如何做呢?
圖中一個(gè)點(diǎn)代表了一個(gè)街區(qū),所以需要對(duì)散點(diǎn)的樣式進(jìn)行設(shè)置,散點(diǎn)的可以設(shè)置的屬性有顏色,大小,形狀等。
實(shí)際選擇哪種視實(shí)際情況(效果,研究目的)而定,這里選用大小來(lái)反映街區(qū)的人口數(shù)量,即設(shè)置參數(shù)s,將散點(diǎn)的大小和人口多少掛鉤。為了便于對(duì)比,將設(shè)置前后的圖放到了一起。
fig,ax?=?plt.subplots(1,2,figsize=(20,6))
ax[0].scatter(x='longitude',y='latitude',data=data,alpha=0.3)
ax[0].set_title('設(shè)置前',size=16)
ax[1].scatter(x='longitude',y='latitude',data=data,alpha=0.3,s=data['population']/100,label='population')
ax[1].set_title('設(shè)置后',size=16)

可以看到,對(duì)于加州北部(黃色框內(nèi))而言,不僅街區(qū)密度不大,而且街區(qū)內(nèi)的人也較少(散點(diǎn)較?。M瑫r(shí),對(duì)于紅色框內(nèi)的區(qū)域,雖然街區(qū)密度較大,但人口密度明顯稀疏不少。
最后,結(jié)合街區(qū)密集度和人口密集度,再看看各個(gè)街區(qū)的價(jià)格分布,這里將顏色和房?jī)r(jià)高低掛鉤,通過(guò)顏色的漸變來(lái)展現(xiàn)房?jī)r(jià)高低,顏色由藍(lán)到紅代表了價(jià)格由低到高,具體用到的參數(shù)為c。
fig,ax?=?plt.subplots(figsize=(9,6))
ax_plot?=?ax.scatter(x='longitude',y='latitude',alpha=0.4,s=data['population']/100,
?????????????????????c='median_house_value',cmap=plt.get_cmap('jet'),data=data)
#?加上顏色棒
fig.colorbar(ax_plot,ax=ax)

通過(guò)對(duì)顏色的設(shè)定,整個(gè)圖看上去顏值高了很多,同時(shí),也可以得到一些結(jié)論:
房?jī)r(jià)比較高的區(qū)域集中于兩個(gè)中心,且都靠近海灣 房?jī)r(jià)高的地方對(duì)應(yīng)的人口密集度也較高
雖然這兩個(gè)數(shù)據(jù)分析的結(jié)論比較顯而易見(jiàn),但這里主要想說(shuō)的是,用散點(diǎn)圖也能夠展現(xiàn)出豐富的信息,在這個(gè)案例中,用alpha呈現(xiàn)了街區(qū)密集度,s呈現(xiàn)了人口密集度,c反映房?jī)r(jià)高低,再加上橫縱坐標(biāo)的經(jīng)緯度,一共反映了5個(gè)維度的信息。
所以,二維散點(diǎn)圖還是很強(qiáng)大的對(duì)吧!只要掌握一些常用的參數(shù)設(shè)置,理清數(shù)據(jù)分析思路,你的散點(diǎn)圖便可以變得既富有信息量,還有高顏值。
-END-

