日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

matplotlib散点图点大小_一步步学Matplotlib炫酷可视化(上)

發(fā)布時間:2025/3/20 编程问答 25 豆豆
生活随笔 收集整理的這篇文章主要介紹了 matplotlib散点图点大小_一步步学Matplotlib炫酷可视化(上) 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

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)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。