html畫圖代碼_python之matplotlib畫圖教程(2)

58c98a7da849254053025168b936a799.png

各位小表貝,你們的畫圖小老弟又來咯~

560497b811f9d8c12d9e997a40608c67.gif

上一次我們聊到了如何畫離散圖,這一次我們來點復雜的,準備好了么,系好安全帶,準備發車咯~滴滴~

a6502a0af5fb8741373e500d24e75343.png

我們先來點比較簡單,那種易于上手的。

如果現在我知道了兩個點的坐標,那么如何畫出一條線呢?聽起來有點簡單過頭。

首先,我們翻開了官網教程的相關頁面。

matplotlib.lines.Line2D - Matplotlib 3.1.0 documentation?matplotlib.org
e55ac476b664619966c0233302b24b0d.png

光是看看參數的數量已經相當復雜了,我想申請撤退。

5e717899c46f4d0af3fe779c1b0b91e4.png

別急,其實絕大多是輔助性的作用,最為重要的是兩個參數xdata和ydata

matplotlib.lines.Line2D(xdata,ydata,……)

從我們一般的理解上來說,確定兩個點的坐標,就可以畫出一條直線,比如現在我想畫出(0,0)到(1,5)的直線,那么是不是我們把這兩個點的坐標放進去就OK了呢?

此刻請允許我東北人上身,能動手,就憋叨叨

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()

69faa41d24e27370e80a9b70bf06ea26.png

等一下!一定是我的開啟方式有問題,為什么沒有畫出一根直線?從一個資深碼農的角度來說,這時候應該是系統出現了問題,我需要,重啟計算機。。

a1f79a7b6b0e1ace575a69e6efeb686e.png

先別。注意看上面對于Line2D的官方解釋,這里的xdata和ydata,并不是我們常規理解下的兩個點的坐標。而是,將兩個點的x坐標和y坐標分別寫成一個數組。

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()

其實啥都沒變,只是把Line2D((0,0),(1,5))變成了Line2D((0,1),(0,5)),為了顯得專業一些,我把代碼重新貼了一份而已。

來,再試一次。

54ea3a9e0fcc6fc8f04eb7843cac0e3e.png

棒!想給自己鼓掌!(怎么著,我自己寫文章還不能給自己加戲了??)

8366d99340ab1f7e86805f4321e382c2.png

接下來,我們再來看看如何畫一個圓

還是從常規理解來說,一個圓最重要的也就是圓心以及半徑。matplotlib的官方團隊一定是竊取了我的想法,竟然和我的認知不謀而合。

f3b152737798b86122b8ed6101fb37c8.png
https://matplotlib.org/3.1.0/api/_as_gen/matplotlib.patches.Circle.html?matplotlib.org

雖然依然有著肥腸多的參數,但是我并不關心,注意看

matplotlib.patches.Circle(xy,radius=5,**kwargs)

這里的xy比較明顯的代表了,應該用一個tuple來表示一個圓心的坐標。(tuple是啥?還不先去把python的基礎課程補一補?)

來,我們繼續動手畫起來。

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()

ae165a19767a9987daa9c6710ea6777a.png

這是在和我開玩笑么?這TM也敢自稱是個圓?我一個漂亮的回旋踢應該也比這個圓吧。

01c4eb1c2942398e66951f2bd4c504ba.png
漂亮的回旋踢--雙節棍

當然究其原因。

  1. x軸和y軸的范圍不同,一個是0到5,一個是0到10
  2. 這整個坐標系看起來就像是一個長方形,即使畫出來的是一個正圓,也會被壓縮成橢圓。

咱們一一解決。

首先,對于x,y軸范圍的問題,可以去設置axis的范圍(axis是啥?去看上一篇)。

fig=plt.figure()
ax=fig.add_subplot(111)
ax.set_xlim(0,10)
ax.set_ylim(0,10)

而如何將一個axis設置為一個正方形的顯示區間,就需要去網上找答案了。

最終千辛萬苦,會發現對于axis而言,有一個方法可以設置它的aspect

ax.set_aspect(num)

這里的num則是x,y軸的長寬比,如果我們想得到一個正兒八經的正方形,num填寫1,修改一下代碼再跑一次試試。

96b27156e67e9b6a5c76e4c288c25b96.png

棒!仔細對比上下兩張圖,你會發現之前橢圓的那張圖,確實不是一個正方形。而且可以負責任的說,matplotlib直接拿來畫圖而不去調整aspect的畫,你一定畫不出一個正圓。(好像說的有點滿。)

39ab7087a13fb7c1e6f4b8e4e84076c1.png

目前來說,我相信你已經知道了如何繪制圓以及直線了,那咱們玩點有難度的。

我們用僅有的一些知識,來畫出一幅人工智能中神經網絡的連接圖。那是個啥?我們先看看結果。

585600265b44e553704800ea19df5c03.png

就是它了。簡單來說,我們把這些圓分為了3層,第一層3個,第二層5個,第三層6個。然后每一層與每一層之間有一個全連接的關系

全連接是啥?嗯。。比如下圖這樣,就是一個點對于下一層的全連接

131dc4ed60c306656547bcc013d8e041.png

是不是已經興奮的搓手手了?來,咱們先考慮考慮,這么一個看起來比較復雜的東西,該怎么畫。(是不是想起了數學書上的課后練習?學會了1+1立馬就得會做8239+44121。)

11269fdbb515e75632c76cd51ae6927c.png

首先來說,這套圖形,充滿了各種重復勞動,而一切的重復勞動在代碼面前都是紙老虎。編碼的意義是什么?就是懶人給自己找到了一個偷懶的方法啊。

從一個編碼人員的角度來說,現在是3層的網絡,但是我希望用一套代碼,可以解決3層,10層,甚至30層,并且只需要改動一個參數就行了,其他的我都不想改,因為,懶!

安排!

經過首輪簡單分析,你可以很輕松的發現,對于圓以及直線而言,他們共用了所有的點。也就是說,兩個直線連接的就是兩個圓心,所以如果我們可以直接把所有圓心的位置都找到,并且儲存成一個數組,那不就萬事大吉了么?

對,就是這么簡單。

d44a0aa996f51830cef71b38f058b9c1.png

就拿我們現在這個3層分布來說,那么一張畫布,就可以被三等分為三個部分。

329bc479e866740e3c39d2cc5fb620fe.png

這么看起來,現在每一個圓心的x軸坐標,可以確定下來了。

但是現在x軸范圍是0到10,我希望如果是0到100也不會影響到我的算法。話句話來說,現在第一層的x軸坐標應該是1.66(怎么算的?自己動動腦子。)如果這時候x的范圍是0到100,那么第一層的x軸坐標就應該是16.6。

所以我需要去動態的進行計算,不應該把這個10當做一個固定值進行計算。

比較幸運的是,我們可以通過調用ax.get_xlim()和ax.get_ylim()來獲取到x軸與y軸的范圍,比如以當前情況而言,會返回一個(0,10)的tuple。

所以這么看起來,如果我按照x軸的長度,除以層數,就可以獲取每一層應該有多寬了。完美!當然圓心和直線的一端就是在每一層x數值的中心咯。

那么對于y軸該如何分呢?以當前的[3,5,6]而言,那我們必然想讓他的排布好看一些,如果office用的多都應該知道啥叫居中排布。

bf53fca4d0ae9c516dcfecf4657d10fe.png

這么看來,每一個圓所在格子的高度,應該以圓的個數最多的那一層為準。比如這時候是第三層的6個,如果其他層有更多呢,比如我們再畫一個。

82ad7ca3ec76b493f2d74936af3a3787.png

那這時候就會以9作為基準。所以目前的第一目標就是找出,哪一層的圓比較多。

如果你要用冒泡算法或者其他的一些排序算法去找,也不是說不可以,不過numpy中有一個方法,用起來比較方便。比如。

import numpy as npa=[1,3,5,2,56,4]
b=np.amax(a)
Out[]: 56

那么好了,現在好像難題都已經被解決了,剩下的就是用各種循環去畫圖了。當然這一次我會先給出部分代碼,我更希望你可以自己動手畫一畫。完整版的代碼會在下一篇文章中以彩蛋的形式發布。(劇透了還能叫彩蛋么?)

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()

如果喜歡請記得點贊收藏加關注哦~么么噠~(有一小段代碼我懶得抽離出方法了,哈哈,反正懶就對了。

7868d6a9e7625320fba60a89a3c49e5b.png

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/534155.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/534155.shtml
英文地址,請注明出處:http://en.pswp.cn/news/534155.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

在linux上面找一個腳本,30個Linux Shell腳本經典案例

在學習Linux運維時,普遍反饋是:Linux Shell是一個很難的知識板塊。雖然大家都認真學,基本的語法也都掌握了,但有需求時,很難直接上手編程,要么寫了很久,要么寫不好!也有很多做運維很…

python圖像識別代碼_用Python進行簡單圖像識別(驗證碼)

這是一個最簡單的圖像識別,將圖片加載后直接利用Python的一個識別引擎進行識別 將圖片中的數字通過 pytesseract.image_to_string(image)識別后將結果存入到本地的txt文件中 #-*-encoding:utf-8-*- import pytesseract from PIL import Image class GetImageDate(ob…

linux 端口添加地址,linux – 綁定,網絡(接口)和多播地址有什么區別?

實際上你在這里混淆了三種方法.第一個是bind,用于將套接字綁定到指定的地址和端口.使用此方法基本上您打開一個udp-port并等待該地址上的此端口的數據.第二個是join-method,用于讓套接字加入指定的多播組.組播組的示例是224.0.0.1 – “所有主機”組播組 – 其針對同一網段上的…

c++ map初始化_Go學習每日一問(18)-map元素查找

每次學習并整理一個Golang的知識點,每天進步一點點。今天學習下go中的一個知識點:map元素查找日省吾身1.下面代碼中 A B 兩處應該怎么修改才能順利編譯?func main() { var m map[string]int //A m["a"] 1 if v : m["b&q…

linux運維需要哪些網絡知識,Linux運維學習筆記-網絡技術知識體系總結

jTemplates部分語法介紹1.{#if} {#if |COND|}..{#elseif |COND|}..{#else}..{#/if} Examples: {#if 2*816} good {#else} fail {# ...解密jQuery內核 DOM操作方法(二)html,text,val回顧下幾組DOM插入有關的方法 innerHTML 設置或獲取位于對象起始和結束標簽…

-bash: wget: 未找到命令_18個堪稱神器的命令行工具,高效運維必備

上期入口:24個 CSS 高級技巧合集提示:因公眾號不支持超鏈接,上圖所有項目地址,可在公眾號后臺回復關鍵字 “命令行工具” 獲取。thefuck命令行打錯了以后,打一個fuck就會自動糾正。GitHub:https://github.c…

linux編輯java文本,linux下的文本編輯器VI的使用命令

1、 移動光標H        #移到屏幕的左上角M         #移到屏幕的中間行開頭L          #移到屏幕的最后一行[         #移到文件開始位置 (雙擊)]         #移到文件結束位置(雙擊):n         #移到文件的第n行Ctrl b     …

python3.8.0安裝_Python3.8.0

Python3.8.0是一款廣受程序員歡迎的編程語言,也是面向對象的一款設計語言,Python以其語言的靈活和簡易性,具有非常簡捷而清晰的語法特點,在腳本工具、數據分析、web后端等等領域都有著優良的表現,收到了大家的廣泛應用…

linux系統proc目錄,快速了解Linux系統下的proc目錄

/proc/devices文件這個文件列出字符和塊設備的主設備號,以及分配到這些設備號的設備名稱。常用的命令為#cat /proc/devices(在調試驅動的時候這個還是有用的,可以通過lsmod查看驅動模塊是否加載)/proc/interrupts這個文件的每一行都有一個保留的中斷。每…

cv2.error: opencv(4.4.0)_【從零學習OpenCV 4】輪廓面積與長度

本文首發于“小白學視覺”微信公眾號,歡迎關注公眾號 本文作者為小白,版權歸人民郵電出版社發行所有,禁止轉載,侵權必究! 經過幾個月的努力,小白終于完成了市面上第一本OpenCV 4入門書籍《OpenCV 4開發詳解…

linux 腳本批量刪除,Linux Shell使用Bash腳本批量刪除文件

PHP每天生成一個存有系統要刪除的臨時文件的.out文件列表,由bash腳本逐行通過讀取.out文件(每一行代表一個待刪除的文件)挨個刪除,代碼如下(dl.sh): #!/bin/bash # Shell script utility to delete file. # You can call script as follows, …

python自定義安裝哪些不需要_【1】python模塊:自定義模塊的3種導入方式

一、定義 模塊就是用一堆的代碼實現了一些功能的代碼的集合,通常一個或者多個函數寫在一個.py文件里,而如果有些功能實現起來很復雜,那么就需要創建n個.py文件,這n個.py文件的集合就是模塊。如果不懂可以先看下面這篇博文&#xf…

linux mysql數據庫日志關閉,linux 怎樣恢復mysql數據庫日志

1、用dump命令備份數據庫。# mysqldump -u root -p dbfile > dbfile.sql2、用rsync從新服務器獲得備份的文件(SCP或WGET也可以)。# rsync -avr rootmyolddbserver:/home/mydumpfolder/dbfile.sql3、登陸新服務器的mysql客戶端。# mysql -u root -p4. 建立數據庫。mysql> …

linux劃分root_vg,為Linux添加新硬盤,劃分LVM分區

1、為VM添加兩塊SCSI硬盤→→完成后重啟VM→→運行fdisk -l,可以看到系統自動將添加的硬盤識別為/dev/sdb和dev/sdc.2、分區對sdb和sdc進行分區,並調整分區類型為8e(LVM類型),sdb劃分為sdb1,sdb2,sdc劃分為sdc1,sdc2,sdc3[rootpromote ~]# fdisk /dev/sd…

python文件輸入符_python讀入文件時加r的作用?

r’xxx’ 的含義 **加 r 會把字符串轉變為非轉義的原始字符串。**比較常用。 例如:print(D:\\test\\test.txt)print(rD:\\test\\test.txt)print(rD:\test\test.txt)123 結果是:D:\test\test.txt D:\\test\\test.txt D:\test\test.txt123 從結果看來&…

linux kvm切換器,KVM切換器是什么,看懂這一篇就夠

原標題:KVM切換器是什么,看懂這一篇就夠在服務器機房的機架不便于存放多個顯示器和鍵盤的空間里,KVM切換器起著重要的作用。KVM切換器能從本地或遠程監視與控制多個計算機與服務器,由鍵盤、鼠標和顯示屏組成的KVM控制臺是最方便和…

alien指令 linux,使用alien命令讓deb包和rpm包互相轉換

OS version: CentOS7 / Debian9發現alien這個命令時很驚喜,之前在debian上安裝etcd找不到安裝包感覺很不科學,有了alien命令事情一下就變簡單了。這里以etcd為例,將etcd從rpm包轉換成deb包,然后傳送到debian機器上安裝。(這個命令…

linux 信號_Linux信號量(1)-SYSTEM V

?信號量概念信號量本質上是一個計數器(不設置全局變量是因為進程間是相互獨立的,而這不一定能看到,看到也不能保證引用計數為原子操作),用于多進程對共享數據對象的讀取,它和管道有所不同,它不以傳送數據為…

kali linux 截圖位置,Kali Linux中使用shutter截圖工具 | CN-SEC 中文網

摘要在Kali 2017以前的版本中默認有一款截圖工具--screenshot,升級到2017版后找不到了,下面介紹一款同樣好用的截圖工具---shutter在Kali 2017以前的版本中默認有一款截圖工具--screenshot,升級到2017版后找不到了,下面介紹一款同…