html画图代码_python之matplotlib画图教程(2)
各位小表貝,你們的畫(huà)圖小老弟又來(lái)咯~
上一次我們聊到了如何畫(huà)離散圖,這一次我們來(lái)點(diǎn)復(fù)雜的,準(zhǔn)備好了么,系好安全帶,準(zhǔn)備發(fā)車咯~滴滴~
我們先來(lái)點(diǎn)比較簡(jiǎn)單,那種易于上手的。
如果現(xiàn)在我知道了兩個(gè)點(diǎn)的坐標(biāo),那么如何畫(huà)出一條線呢?聽(tīng)起來(lái)有點(diǎn)簡(jiǎn)單過(guò)頭。
首先,我們翻開(kāi)了官網(wǎng)教程的相關(guān)頁(yè)面。
matplotlib.lines.Line2D - Matplotlib 3.1.0 documentation?matplotlib.org光是看看參數(shù)的數(shù)量已經(jīng)相當(dāng)復(fù)雜了,我想申請(qǐng)撤退。
別急,其實(shí)絕大多是輔助性的作用,最為重要的是兩個(gè)參數(shù)xdata和ydata
matplotlib.lines.Line2D(xdata,ydata,……)
從我們一般的理解上來(lái)說(shuō),確定兩個(gè)點(diǎn)的坐標(biāo),就可以畫(huà)出一條直線,比如現(xiàn)在我想畫(huà)出(0,0)到(1,5)的直線,那么是不是我們把這兩個(gè)點(diǎn)的坐標(biāo)放進(jìn)去就OK了呢?
此刻請(qǐng)?jiān)试S我東北人上身,能動(dòng)手,就憋叨叨。
import matplotlib.pyplot as plt from matplotlib.pyplot import Line2Dfig=plt.figure() ax=fig.add_subplot(111) ax.set_xlim(0,5) ax.set_ylim(0,5) line=Line2D((0,0),(1,5)) ax.add_line(line) plt.show()等一下!一定是我的開(kāi)啟方式有問(wèn)題,為什么沒(méi)有畫(huà)出一根直線?從一個(gè)資深碼農(nóng)的角度來(lái)說(shuō),這時(shí)候應(yīng)該是系統(tǒng)出現(xiàn)了問(wèn)題,我需要,重啟計(jì)算機(jī)。。
先別。注意看上面對(duì)于Line2D的官方解釋,這里的xdata和ydata,并不是我們常規(guī)理解下的兩個(gè)點(diǎn)的坐標(biāo)。而是,將兩個(gè)點(diǎn)的x坐標(biāo)和y坐標(biāo)分別寫(xiě)成一個(gè)數(shù)組。
import matplotlib.pyplot as plt from matplotlib.pyplot import Line2Dfig=plt.figure() ax=fig.add_subplot(111) ax.set_xlim(0,5) ax.set_ylim(0,5) line=Line2D((0,1),(0,5)) ax.add_line(line) plt.show()其實(shí)啥都沒(méi)變,只是把Line2D((0,0),(1,5))變成了Line2D((0,1),(0,5)),為了顯得專業(yè)一些,我把代碼重新貼了一份而已。
來(lái),再試一次。
棒!想給自己鼓掌!(怎么著,我自己寫(xiě)文章還不能給自己加戲了??)
接下來(lái),我們?cè)賮?lái)看看如何畫(huà)一個(gè)圓。
還是從常規(guī)理解來(lái)說(shuō),一個(gè)圓最重要的也就是圓心以及半徑。matplotlib的官方團(tuán)隊(duì)一定是竊取了我的想法,竟然和我的認(rèn)知不謀而合。
https://matplotlib.org/3.1.0/api/_as_gen/matplotlib.patches.Circle.html?matplotlib.org雖然依然有著肥腸多的參數(shù),但是我并不關(guān)心,注意看
matplotlib.patches.Circle(xy,radius=5,**kwargs)
這里的xy比較明顯的代表了,應(yīng)該用一個(gè)tuple來(lái)表示一個(gè)圓心的坐標(biāo)。(tuple是啥?還不先去把python的基礎(chǔ)課程補(bǔ)一補(bǔ)?)
來(lái),我們繼續(xù)動(dòng)手畫(huà)起來(lái)。
import matplotlib.pyplot as plt from matplotlib.patches import Circlefig=plt.figure() ax=fig.add_subplot(111) cir=Circle((3,3),radius=2) ax.add_patch(cir) plt.show()這是在和我開(kāi)玩笑么?這TM也敢自稱是個(gè)圓?我一個(gè)漂亮的回旋踢應(yīng)該也比這個(gè)圓吧。
漂亮的回旋踢--雙節(jié)棍當(dāng)然究其原因。
咱們一一解決。
首先,對(duì)于x,y軸范圍的問(wèn)題,可以去設(shè)置axis的范圍(axis是啥?去看上一篇)。
fig=plt.figure() ax=fig.add_subplot(111) ax.set_xlim(0,10) ax.set_ylim(0,10)而如何將一個(gè)axis設(shè)置為一個(gè)正方形的顯示區(qū)間,就需要去網(wǎng)上找答案了。
最終千辛萬(wàn)苦,會(huì)發(fā)現(xiàn)對(duì)于axis而言,有一個(gè)方法可以設(shè)置它的aspect
ax.set_aspect(num)
這里的num則是x,y軸的長(zhǎng)寬比,如果我們想得到一個(gè)正兒八經(jīng)的正方形,num填寫(xiě)1,修改一下代碼再跑一次試試。
棒!仔細(xì)對(duì)比上下兩張圖,你會(huì)發(fā)現(xiàn)之前橢圓的那張圖,確實(shí)不是一個(gè)正方形。而且可以負(fù)責(zé)任的說(shuō),matplotlib直接拿來(lái)畫(huà)圖而不去調(diào)整aspect的畫(huà),你一定畫(huà)不出一個(gè)正圓。(好像說(shuō)的有點(diǎn)滿。)
目前來(lái)說(shuō),我相信你已經(jīng)知道了如何繪制圓以及直線了,那咱們玩點(diǎn)有難度的。
我們用僅有的一些知識(shí),來(lái)畫(huà)出一幅人工智能中神經(jīng)網(wǎng)絡(luò)的連接圖。那是個(gè)啥?我們先看看結(jié)果。
就是它了。簡(jiǎn)單來(lái)說(shuō),我們把這些圓分為了3層,第一層3個(gè),第二層5個(gè),第三層6個(gè)。然后每一層與每一層之間有一個(gè)全連接的關(guān)系。
全連接是啥?嗯。。比如下圖這樣,就是一個(gè)點(diǎn)對(duì)于下一層的全連接。
是不是已經(jīng)興奮的搓手手了?來(lái),咱們先考慮考慮,這么一個(gè)看起來(lái)比較復(fù)雜的東西,該怎么畫(huà)。(是不是想起了數(shù)學(xué)書(shū)上的課后練習(xí)?學(xué)會(huì)了1+1立馬就得會(huì)做8239+44121。)
首先來(lái)說(shuō),這套圖形,充滿了各種重復(fù)勞動(dòng),而一切的重復(fù)勞動(dòng)在代碼面前都是紙老虎。編碼的意義是什么?就是懶人給自己找到了一個(gè)偷懶的方法啊。
從一個(gè)編碼人員的角度來(lái)說(shuō),現(xiàn)在是3層的網(wǎng)絡(luò),但是我希望用一套代碼,可以解決3層,10層,甚至30層,并且只需要改動(dòng)一個(gè)參數(shù)就行了,其他的我都不想改,因?yàn)?#xff0c;懶!
安排!
經(jīng)過(guò)首輪簡(jiǎn)單分析,你可以很輕松的發(fā)現(xiàn),對(duì)于圓以及直線而言,他們共用了所有的點(diǎn)。也就是說(shuō),兩個(gè)直線連接的就是兩個(gè)圓心,所以如果我們可以直接把所有圓心的位置都找到,并且儲(chǔ)存成一個(gè)數(shù)組,那不就萬(wàn)事大吉了么?
對(duì),就是這么簡(jiǎn)單。
就拿我們現(xiàn)在這個(gè)3層分布來(lái)說(shuō),那么一張畫(huà)布,就可以被三等分為三個(gè)部分。
這么看起來(lái),現(xiàn)在每一個(gè)圓心的x軸坐標(biāo),可以確定下來(lái)了。
但是現(xiàn)在x軸范圍是0到10,我希望如果是0到100也不會(huì)影響到我的算法。話句話來(lái)說(shuō),現(xiàn)在第一層的x軸坐標(biāo)應(yīng)該是1.66(怎么算的?自己動(dòng)動(dòng)腦子。)如果這時(shí)候x的范圍是0到100,那么第一層的x軸坐標(biāo)就應(yīng)該是16.6。
所以我需要去動(dòng)態(tài)的進(jìn)行計(jì)算,不應(yīng)該把這個(gè)10當(dāng)做一個(gè)固定值進(jìn)行計(jì)算。
比較幸運(yùn)的是,我們可以通過(guò)調(diào)用ax.get_xlim()和ax.get_ylim()來(lái)獲取到x軸與y軸的范圍,比如以當(dāng)前情況而言,會(huì)返回一個(gè)(0,10)的tuple。
所以這么看起來(lái),如果我按照x軸的長(zhǎng)度,除以層數(shù),就可以獲取每一層應(yīng)該有多寬了。完美!當(dāng)然圓心和直線的一端就是在每一層x數(shù)值的中心咯。
那么對(duì)于y軸該如何分呢?以當(dāng)前的[3,5,6]而言,那我們必然想讓他的排布好看一些,如果office用的多都應(yīng)該知道啥叫居中排布。
這么看來(lái),每一個(gè)圓所在格子的高度,應(yīng)該以圓的個(gè)數(shù)最多的那一層為準(zhǔn)。比如這時(shí)候是第三層的6個(gè),如果其他層有更多呢,比如我們?cè)佼?huà)一個(gè)。
那這時(shí)候就會(huì)以9作為基準(zhǔn)。所以目前的第一目標(biāo)就是找出,哪一層的圓比較多。
如果你要用冒泡算法或者其他的一些排序算法去找,也不是說(shuō)不可以,不過(guò)numpy中有一個(gè)方法,用起來(lái)比較方便。比如。
import numpy as npa=[1,3,5,2,56,4] b=np.amax(a) Out[]: 56那么好了,現(xiàn)在好像難題都已經(jīng)被解決了,剩下的就是用各種循環(huán)去畫(huà)圖了。當(dāng)然這一次我會(huì)先給出部分代碼,我更希望你可以自己動(dòng)手畫(huà)一畫(huà)。完整版的代碼會(huì)在下一篇文章中以彩蛋的形式發(fā)布。(劇透了還能叫彩蛋么?)
import numpy as np import matplotlib.pyplot as plt from matplotlib.patches import Circle from matplotlib.pyplot import Line2Ddef draw_level(each_level):ylim=ax1.get_ylim()[1]xlim=ax1.get_xlim()[1]each_level=np.array(each_level)each_col=xlim/((len(each_level)))each_row=ylim/np.amax(each_level)radius=0.4*each_rowfor i,item in enumerate(each_level):# your code heredef draw_line(each_level):ylim = ax1.get_ylim()[1]xlim = ax1.get_xlim()[1]each_level = np.array(each_level)each_col = xlim / ((len(each_level)) )each_row = ylim / np.amax(each_level)result=list()for i, item in enumerate(each_level):# your code herefor i in range(len(each_level)-1):for item in result[i]:for i_next in result[i+1]:# your code here fig=plt.figure() ax1=fig.add_subplot(111) ax1.set_xlim(0,10) ax1.set_ylim(0,10) ax1.set_aspect(1) each_level=[3,5,9,6] draw_line(each_level) draw_level(each_level) plt.show()如果喜歡請(qǐng)記得點(diǎn)贊收藏加關(guān)注哦~么么噠~(有一小段代碼我懶得抽離出方法了,哈哈,反正懶就對(duì)了。)
總結(jié)
以上是生活随笔為你收集整理的html画图代码_python之matplotlib画图教程(2)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: opencv如何把一个矩阵不同列分离开_
- 下一篇: websocket python爬虫_p