Matplotlib 可视化之多图层叠加
我們一起來(lái)看看精彩的可視化圖表是如何繪制出來(lái)的。
定義曲線函數(shù)
首先定義出圖中隨機(jī)曲線的繪圖函數(shù)。
#?Some?nice?but?random?curves def?curve():n?=?np.random.randint(1,?5)centers?=?np.random.normal(0.0,?1.0,?n)widths?=?np.random.uniform(5.0,?50.0,?n)widths?=?10?*?widths?/?widths.sum()scales?=?np.random.uniform(0.1,?1.0,?n)scales?/=?scales.sum()X?=?np.zeros(500)x?=?np.linspace(-3,?3,?len(X))for?center,?width,?scale?in?zip(centers,?widths,?scales):X?=?X?+?scale?*?np.exp(-(x?-?center)?*?(x?-?center)?*?width)return?X繪圖
將比較抽象的曲線函數(shù)可視化,更加直觀。
np.random.seed(123) #?獲取曲線數(shù)據(jù) Y?=?curve() X?=?np.linspace(-3,?3,?len(Y)) #?畫(huà)布準(zhǔn)備 fig?=?plt.figure(figsize=(10,?6),dpi=600) #?設(shè)置畫(huà)布 ax?=?plt.subplot(1,?1,?1,?frameon=False,?sharex=ax) #?繪制曲線 ax.plot(X,?3?*?Y,?color="k",?linewidth=0.75,?zorder=100) plt.show()由于該函數(shù)的隨機(jī)性,每次運(yùn)行都會(huì)給出不同的結(jié)果:
配置樣式
填充顏色、設(shè)置坐標(biāo)軸及坐標(biāo)軸標(biāo)簽。這里重點(diǎn)是顏色填充函數(shù):Axes.fill_between()
Axes.fill_between(self,?x,?y1,?y2=0,?where=None,?interpolate=False,?step=None,?*,?data=None,?**kwargs)參數(shù):
x: 該參數(shù)包含用于定義曲線的數(shù)據(jù)點(diǎn)的水平坐標(biāo)。
y1: 此參數(shù)包含用于定義第一條曲線的數(shù)據(jù)點(diǎn)的y坐標(biāo)
y2: 該參數(shù)包含用于定義第二條曲線的數(shù)據(jù)點(diǎn)的y坐標(biāo)。它是可選的,默認(rèn)值為0。
where: 此參數(shù)是可選參數(shù)。它用于排除某些水平區(qū)域的填充。
interpolate: 此參數(shù)也是可選參數(shù)。它是錯(cuò)誤欄行的線寬,默認(rèn)值為NONE。
step: 此參數(shù)也是可選參數(shù)。它用于定義填充是否應(yīng)為階躍函數(shù)。
顏色填充有四種用法
① 基本用法
參數(shù) y1 和 y2 可以是標(biāo)量,表示給定y值處的水平邊界。只要 y1 給出, y2 ?默認(rèn)為0。
ax1.fill_between(X,?Y,?color=color[0]) ax2.fill_between(X,?Y,?1,?color=color[1]) ax3.fill_between(X,?Y,?Y2,?color=color[2])② 置信區(qū)間
一個(gè)常見(jiàn)的應(yīng)用 fill_between 是置信帶的指示。
當(dāng) fill_between 使用填充顏色填充某個(gè)區(qū)域時(shí),這些顏色可能有點(diǎn)強(qiáng),以至于宣兵奪主。我們希望淡化填充區(qū)域而突出主體。因此設(shè)置參數(shù)alpha的值,以達(dá)到減淡顏色,使該區(qū)域半透明的目的。
y_err?=?X.std()?*?np.sqrt(1/len(X)?+??(X?-?X.mean())**2?/?np.sum((X?-?X.mean())**2)) ax.fill_between(X,?3*Y?-?y_err,?3*Y?+?y_err,alpha=0.2,?color=cmap(0.3))③ 選擇性填充水平區(qū)域
參數(shù)where允許指定要填充的 x 范圍。它是一個(gè)與x大小相同的布爾數(shù)組。
僅填充連續(xù) True 序列的x范圍。因此,相鄰的 True 和 False 值之間的范圍永遠(yuǎn)不會(huì)被填滿(mǎn)。當(dāng)數(shù)據(jù)點(diǎn)應(yīng)該表示一個(gè)連續(xù)的量時(shí),通常不希望出現(xiàn)這種情況。因此,建議設(shè)置 interpolate=True,除非數(shù)據(jù)點(diǎn)的x距離足夠細(xì),使上述效果不明顯。插值近似于實(shí)際的x位置,在那里 where 條件將改變,并擴(kuò)展填充到那里。
ax1.fill_between(x01,?y01,?y02,?where=(y01?>?y02),?color='C0',?alpha=0.3) ax1.fill_between(x01,?y01,?y02,where=(y01?<?y02),?color='C1',?alpha=0.3)ax2.fill_between(x01,?y01,?y02,?where=(y01?>?y02),?color='C0',?alpha=0.3,interpolate=True) ax2.fill_between(x01,?y01,?y02,?where=(y01?<=?y02),?color='C1',?alpha=0.3,interpolate=True)④ 在整個(gè)軸上有選擇地標(biāo)記水平區(qū)域
同樣的選擇機(jī)制可以應(yīng)用于填滿(mǎn)坐標(biāo)軸的全部垂直高度。為了不受y極限的影響,我們添加了一個(gè)轉(zhuǎn)換來(lái)解釋數(shù)據(jù)坐標(biāo)中的x值和坐標(biāo)軸坐標(biāo)中的y值。
下面的示例標(biāo)記y數(shù)據(jù)高于給定閾值的區(qū)域。
threshold?=?0.4 ax.axhline(threshold,?color=cmap(0.2),?lw=2,?alpha=0.7,linestyle='-.') ax.fill_between(X,?0,?1,?where=?3*Y?>?threshold,?color=cmap(0.5),?alpha=0.5,?transform=ax.get_xaxis_transform())本案例中,選擇第一種常規(guī)填充。
#?畫(huà)布準(zhǔn)備 cmap?=?mpl.cm.get_cmap("Spectral") color?=?cmap(0) ax.fill_between(X,?3?*?Y,?0,?color=color,?zorder=100) ax.yaxis.set_tick_params(tick1On=False) ax.set_xlim(-3,?3) ax.set_ylim(-1,?4) ax.axvline(0.0,?ls="--",?lw=0.75,?color="black",?zorder=250) ax.text(0.0,?1.0,"Value?%d"?%?1,ha="left",?va="top",weight="bold",?size=15,transform=ax.transAxes,) ax.yaxis.set_tick_params(labelleft=True) ax.set_yticks(np.arange(1)) ax.set_yticklabels(["Serie?%d"?%?i?for?i?in?range(1,?2)]) for?tick?in?ax.yaxis.get_major_ticks():tick.label.set_fontsize(15)tick.label.set_verticalalignment("bottom")?#?垂直對(duì)齊 plt.show()多圖層疊加
zorder 用來(lái)控制繪圖順序,其值越大,畫(huà)上去越晚,線條的疊加就是在上面的。對(duì) plotting 方法的任何調(diào)用都可以顯式地為該特定項(xiàng)的 zorder 設(shè)置值。許多創(chuàng)建可見(jiàn)對(duì)象的函數(shù)都接受 zorder 參數(shù)。或者可以在繪圖后調(diào)用 set_order() 函數(shù)作用在創(chuàng)建的對(duì)象上。
接下來(lái)開(kāi)始繪制開(kāi)篇的這個(gè)圖,我們發(fā)現(xiàn)每條曲線都部分地覆蓋了其他曲線,因此為每條曲線設(shè)置適當(dāng)?shù)膠order是很重要的,這樣渲染將獨(dú)立于繪制順序。
通過(guò)橫向及縱向循環(huán)繪制多個(gè)圖形,這里注意設(shè)置疊放次序參數(shù)zorder,最下面的在最上面,然后依次疊放。
rows,?cols?=?3,?4 ax?=?None for?n?in?range(rows):#?設(shè)置多子圖ax?=?plt.subplot(1,?rows,?n?+?1,?frameon=False,?sharex=ax)for?i?in?range(cols):Y?=?curve()X?=?np.linspace(-3,?3,?len(Y))ax.plot(X,?3?*?Y?+?i,?color="k",?linewidth=0.75,?zorder=100?-?i)color?=?cmap(i?/?cols)ax.fill_between(X,?3?*?Y?+?i,?i,?color=color,?zorder=100?-?i)最后多次循環(huán),可以得到下圖。
參考資料
Scientific Visualisation-Python & Matplotlib
Python數(shù)據(jù)科學(xué)手冊(cè)
END
各位伙伴們好,詹帥本帥搭建了一個(gè)個(gè)人博客和小程序,匯集各種干貨和資源,也方便大家閱讀,感興趣的小伙伴請(qǐng)移步小程序體驗(yàn)一下哦!(歡迎提建議)推薦閱讀
牛逼!Python常用數(shù)據(jù)類(lèi)型的基本操作(長(zhǎng)文系列第①篇)
牛逼!Python的判斷、循環(huán)和各種表達(dá)式(長(zhǎng)文系列第②篇)
牛逼!Python函數(shù)和文件操作(長(zhǎng)文系列第③篇)
牛逼!Python錯(cuò)誤、異常和模塊(長(zhǎng)文系列第④篇)
總結(jié)
以上是生活随笔為你收集整理的Matplotlib 可视化之多图层叠加的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 我发现了pandas的黄金搭档!
- 下一篇: Pandas多层级索引的数据分析案例,超