matplotlib散点图点大小_一步步学Matplotlib炫酷可视化(上)
Matplotlib可以說是Python最聲名遠(yuǎn)揚(yáng)的可視化庫了,也是Python數(shù)據(jù)分析庫的“三駕馬車”之一。Matplotlib是基礎(chǔ)而非常強(qiáng)大的可視化庫,Seaborn等好用的可視化庫是在前者的基礎(chǔ)上進(jìn)行的封裝。Matplotlib擅長快速出簡單的圖、有豐富的接口進(jìn)行精細(xì)化繪圖、和Numpy結(jié)合做科學(xué)可視化及三維圖配合默契、三維圖。但也有些缺點,如不容易基于實用目的繪制有一定難度的圖表(如小提琴圖等)、標(biāo)簽等元素需指定坐標(biāo)而不能自適應(yīng)優(yōu)化顯示、難以實現(xiàn)交互。
官網(wǎng)說:
Matplotlib tries to make easy things easy and hard things possible.
我越用越認(rèn)可這句話,Matplotlib非常強(qiáng)大,Hard things是possible但并非easy and fast。
Matplotlib出圖示例
可視化基礎(chǔ)框架
對于一個數(shù)據(jù)表df(通過pandas讀入為DataFrame)來說,用Matplotlib對其進(jìn)行可視化的基礎(chǔ)框架為:
fig, ax = plt.subplots()ax.plot(df['x'],df['y'])通過上面幾行代碼就可以畫出df表周一到周五y指標(biāo)的變化折線。
折線圖繪制示例
Matplotlib其實為作圖提供了兩套可視化接口:
- plt.plot()系列
- fig, ax = plt.subplots() ax.plot() 系列
根據(jù)官網(wǎng)教程,分別對應(yīng)MATLAB的陳述式語法和面向?qū)ο髮懛?#xff0c;
個人理解,plt.plot()適合用于快速出圖,讀入一個數(shù)據(jù)表后想快速知道數(shù)據(jù)分布、指標(biāo)關(guān)系等,通過plt.plot()系列語句直接出圖,而ax.plot()更方便用來精細(xì)繪圖,接口對各種圖表元素的編輯很友好。
在Matplotlib官網(wǎng)搜索,通常能看到兩套接口,如搜繪制餅圖的關(guān)鍵詞pie,結(jié)果中的axes.Axes.pie對應(yīng)ax.pie()的用法,pyplot.pie對應(yīng)plt.pie()的函數(shù)接口。
ax.×××()的寫法看起來要寫的語句多些,但這種面向?qū)ο?object-oriented)的寫法通過fig, ax = plt.subplots()建立畫布(figure)和定義軸域(axes),能更明確在哪作畫和映射規(guī)則,給用戶更大的自由度和更精細(xì)的調(diào)參能力。Axes包含了一套坐標(biāo)軸(axis),確定了x/y坐標(biāo)軸之后,數(shù)值再確定對應(yīng)坐標(biāo),也就唯一確定了所在位置(這是二維情況下,更高維度就會對應(yīng)著更多的axis),散點圖是去確定點在軸域下的位置,柱狀圖是確定每個柱柱所在的位置,因此一套Axes就確定了唯一的獨(dú)立的圖,一個畫布可以有多套Axes。簡單說就是ax.×××()更方便調(diào)細(xì)節(jié),初學(xué)者盡量避免用plt.×××系列來畫圖。
基礎(chǔ)圖表繪制
數(shù)據(jù)可視化從目的來說,是為了更直觀展示數(shù)據(jù)或數(shù)據(jù)之間的對比、分布或關(guān)聯(lián)關(guān)系。散點圖、折線圖、柱狀圖、條形圖、餅圖、直方圖是非常常用而基礎(chǔ)的可視化圖。個人認(rèn)為通過畫這幾種基礎(chǔ)圖并調(diào)細(xì)節(jié)是很好的學(xué)可視化實踐。
將數(shù)據(jù)映射為可視圖表
為了整體的美觀和一致性,本文都用了一套自定義配色,通過mpl.rcParams["axes.prop_cycle"] = mpl.cycler('color', ['1EAFAE', 'A3FFFF', '69FFFF']) 語句實現(xiàn)簡單改配色,具體關(guān)于mpl.rcParams后面再展開。
畫散點圖可以用兩種主要的方法,scatter(x,y)和plot(x,y,'o') 。 通過ax.scatter(x,y)繪制以x為橫坐標(biāo),y為縱坐標(biāo)的散點圖,scatter的重要參數(shù)如下:
- x,y:對應(yīng)著x軸和y軸的數(shù)據(jù),散點畫在坐標(biāo)軸里的[xi,yi]處。
- s,c,alpha: 對應(yīng)散點大小(size)、顏色(color)、透明度,都可以傳一個和點數(shù)量相同長度的數(shù)組,如s=df['z']可以做氣泡圖,一般氣泡圖為了防止遮蓋問題,通常設(shè)置一定的透明度,alpha的范圍為0到1。c='#BA5C25'設(shè)置點顏色,c賦值為一個數(shù)組可以做出每個點一個顏色的效果。
- marker:設(shè)置點的形狀;
- cmap:顏色映射;
- norm:當(dāng)顏色c為一組浮點數(shù)時,把值標(biāo)準(zhǔn)化到[0,1]做顏色映射,vmin和vamx參數(shù)是結(jié)合 norm 來用的;
散點圖參數(shù)示例
ax.plot(x,y,'o')也可以畫散點圖,ax.plot()核心是繪制坐標(biāo)系下的點和點之間的連線的,當(dāng)突出點的大小而省略線時,就是散點圖了,同樣突出線就變成了折線圖。通過fmt(也就是format_string)參數(shù)來控制這些,包括點的形狀、顏色、線的風(fēng)格顏色等。折線圖基礎(chǔ)繪制效果可回看上一部分可視化基礎(chǔ)框架。
plot()的常用參數(shù)如下:
- x,y: x軸和y軸的數(shù)據(jù),當(dāng)plot()只有一個輸入列表或數(shù)組時,參數(shù)被當(dāng)做y軸,也就是value,x軸以索引自動生成,也就是ax.plot(y)相當(dāng)于ax.plot(range(len(y)),y);
- fmt: 控制x,y繪制的折線的點形狀、顏色、線的風(fēng)格、顏色;
- 其他的lines.Line2D支持的屬性, 如color控制線顏色,marker控制點形狀,linestyle控制線風(fēng)格類型及l(fā)inewidth控制線寬等,如果既設(shè)置了fmt又指定了color呢?可以實踐一下,線的顏色會根據(jù)color屬性最終顯示。
常用fmt字符意義整理(可收藏方便查閱)
plot()除了plot(x,y,[fmt])這種寫法之外,還可以傳多套x,y以繪制多條折線,寫法是plot(x,y,[fmt],x2,y2,[fmt2],…)。
另外plot()還支持plot('col1','col2',data=df)這種寫法,這是對二維表格數(shù)據(jù)更友好的接口。本文講到的其他圖形如bar、barh等基本也都是支持ax.×××(df['x'],df['y']) 和ax.×××(x,y,data)寫法的。
通過ax.bar(x,height)繪制柱狀圖,條形圖的繪制用ax.barh(y,width),因bar和barh的用法很類似,參數(shù)之間有對應(yīng)關(guān)系,這里結(jié)合著看。
x,height: x軸的值和各柱的高,相當(dāng)于折線圖的x,y;width: 柱的寬度,默認(rèn)是0.8,也可以傳入一個數(shù)組,畫不等寬的柱狀圖;bottom: 每個柱底部開始位置,默認(rèn)是0,改bottom可以畫堆積柱狀圖、瀑布圖等;align: 柱狀的x是在柱底部中心還是邊緣,{'center', 'edge'},默認(rèn)是center;data: 可以傳入一個DataFrame,用法和前面說到的ax.plot('col1','col2',data=df)一致;其他像color(柱顏色)、edgecolor(柱邊框色)、linewidth(邊框線寬)等圖元屬性用法都一致,linewidth也是可以簡寫為lw的,顏色可以傳一個數(shù)組,可以畫出五彩斑斕的柱,也可借由這個參數(shù)美化瀑布圖;條形圖barh的參數(shù)有barh(y,width,height,left,align),y是Y軸的值,每個柱的位置,因此barh的y對應(yīng)bar的x,barh的width對應(yīng)bar的height,barh的height對應(yīng)bar的width。每個柱開始的位置是left,對應(yīng)bar的bottom。align、data、color等一致。注意的是柱狀圖繪制語句ax.bar(x,height)的返回值是一個容器(BarContainer),包含了所有畫出來的柱。通過這個返回值可以對柱進(jìn)行一些個性化的處理,另外的應(yīng)用就是根據(jù)返回柱的屬性給每個柱標(biāo)上文本標(biāo)簽。
#給柱狀圖標(biāo)上標(biāo)簽fig,ax= plt.subplots()rects=ax.bar(df['x'],df['y'])ax.set_ylim(0,100)for rect in rects: ? ?height = rect.get_height() ? ?ax.annotate('{}'.format(height), ? ? ? ? ? ?xy=(rect.get_x() + rect.get_width() / 2, height), ? ? ? ? ? ?xytext=(0,1), ?# 1 points vertical offset ? ? ? ? ? ?textcoords="offset points", ? ? ? ? ? ?ha='center', va='bottom')通過給x以一定的偏移量,繪制簇狀柱形圖。代碼如下:
#簇狀柱 ClusterBarx = list(range(1,len(df)+1)) ?width = 0.2 ?#每個柱的寬度x1=[i-width for i in x]x2=[i+width for i in x]fig, ax = plt.subplots(figsize=(6,5))rects1 = ax.bar(x1,df['y'], width*2, label='Men',color='#1EAFAE')rects2 = ax.bar(x2,df['z'], width*2, label='Women',color='#69FFFF')?ax.set_xticks(x)ax.set_xticklabels(df['x'])ax.legend()通過給bottom參數(shù)傳一個數(shù)組,可以畫堆疊柱狀圖:堆疊柱除了等值堆疊之外,還可以等比堆疊,思路就是將每個x對應(yīng)的柱都做一下數(shù)值變換,把柱的高度約束在[0,1],且堆疊之和為1,height=h[i]/sum(h)。
#堆疊柱狀圖fig,ax= plt.subplots()ax.bar(df['x'],df['y'],label='Men')ax.bar(df['x'],df['z'],bottom=df['y'],label='Women')ax.legend()?#等比例堆疊柱fig,ax= plt.subplots()df['y1']=df.apply(lambda x:(x['y'])*100/(x['y']+x['z']),axis=1)df['z1']=df.apply(lambda x:(x['z'])*100/(x['y']+x['z']),axis=1)ax.bar(df['x'],df['y1'])ax.bar(df['x'],df['z1'],bottom=df['y1'])ax.set_ylim(0,100) #標(biāo)簽設(shè)置等代碼省略堆疊柱狀圖繪制效果
調(diào)節(jié)width參數(shù)使得柱和柱之間的寬度為0,并對數(shù)據(jù)進(jìn)行統(tǒng)計在畫圖,可以用ax.bar()繪制直方圖,但也不需要這么復(fù)雜,Matplotlib提供了繪制直方圖的接口ax.hist(x,bins,normed),可以直接對某列數(shù)據(jù)繪制直方圖。x是需要統(tǒng)計分布的數(shù)據(jù)列,bins控制分箱的個數(shù),默認(rèn)是10。
箱線圖在數(shù)據(jù)分析中挺常用的,箱線圖對于數(shù)據(jù)分布有很好的展示作用,Matplotlib提供了boxplot(x)用于繪制箱線圖。
fig, ax= plt.subplots()ax.boxplot(df['y']) ?#箱線圖餅圖是可視化中基礎(chǔ)而重要的圖形,是各種數(shù)據(jù)報告的常客,Matplotlib繪制餅圖時因為xy軸默認(rèn)比例尺不同,為了得到不扁的餅,需設(shè)置xy軸1像素對應(yīng)的值相等。
#繪制餅圖fig,ax=plt.subplots(subplot_kw=dict(aspect="equal")) ax.pie(df['y']) #為了得到不扁的餅,設(shè)置xy軸比例尺相同#---#環(huán)狀圖fig, ax = plt.subplots(subplot_kw=dict(aspect="equal")) wps=dict(width=0.3, edgecolor='w')ax.pie(df['y'], radius=1,startangle=90,counterclock=False,wedgeprops=wps)ax.pie(df['z'], radius=1-0.3,startangle=90,counterclock=False,wedgeprops=wps)本文近五千字,從基礎(chǔ)圖表入手拆解對應(yīng)繪制函數(shù)的重點參數(shù),共10張圖,基本都是個人繪制和排版的,個人認(rèn)為較系統(tǒng)講了Matplotlib的用法和核心功能,下篇會實踐更有趣的內(nèi)容。
畫心形線(下篇彩蛋)
總結(jié)
以上是生活随笔為你收集整理的matplotlib散点图点大小_一步步学Matplotlib炫酷可视化(上)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: python中执行sql语句_Pytho
- 下一篇: 三菱变频器e700参数表_三菱Q系列PL