Python畫圖之總結(jié)待整理
成都創(chuàng)新互聯(lián)是一家專注于成都網(wǎng)站建設(shè)、做網(wǎng)站與策劃設(shè)計(jì),寧強(qiáng)網(wǎng)站建設(shè)哪家好?成都創(chuàng)新互聯(lián)做網(wǎng)站,專注于網(wǎng)站建設(shè)10余年,網(wǎng)設(shè)計(jì)領(lǐng)域的專業(yè)建站公司;建站業(yè)務(wù)涵蓋:寧強(qiáng)等地區(qū)。寧強(qiáng)做網(wǎng)站價(jià)格咨詢:13518219792
Python Data Visualizations
Seaborn 庫:
Python Seaborn 教程:
matplotlib: plotting with Python
matplotlib: plotting with Python-github
python-data-visualization-course
Interactive Web Plotting for Python
Interactive Web Plotting for Python-github
CSDN-markdown編輯器語法——字體、字號(hào)與顏色
%matplotlib inline
%matplotlib notebook
Need to use either
or
Only one in each notebook! using inline will just sent png images to browser, using notebook will provide interactivity and allow updating old figures. With notebook you need to make sure to create a new figure before plotting, otherwise the last one will be updated!
還有簡便的 plt.close('all') 關(guān)閉所有圖,不用管 fig 號(hào)碼
Some plots from these tutorials:
調(diào)整名字和間隔
設(shè)置不同名字和位置
調(diào)整坐標(biāo)軸
參數(shù)loc='upper right'
表示圖例將添加在圖中的右上角.
調(diào)整位置和名稱
最后我們得到帶有圖例信息的圖片.
移動(dòng)坐標(biāo)
然后我們挪動(dòng)坐標(biāo)軸的位置.
然后標(biāo)注出點(diǎn)(x0, y0)的位置信息. 用plt.plot([x0, x0,], [0, y0,], 'k--', linewidth=2.5)
畫出一條垂直于x軸的虛線.
添加注釋 annotate
接下來我們就對(duì)(x0, y0)這個(gè)點(diǎn)進(jìn)行標(biāo)注.
其中參數(shù)xycoords='data'
是說基于數(shù)據(jù)的值來選位置,xytext=(+30, -30)
和textcoords='offset points'
對(duì)于標(biāo)注位置的描述 和 xy 偏差值,arrowprops
是對(duì)圖中箭頭類型的一些設(shè)置.
添加注釋 text
其中-3.7, 3,
是選取text的位置, 空格需要用到轉(zhuǎn)字符
,fontdict
設(shè)置文本字體.
生成圖形
當(dāng)圖片中的內(nèi)容較多,相互遮蓋時(shí),我們可以通過設(shè)置相關(guān)內(nèi)容的透明度來使圖片更易于觀察,也即是通過本節(jié)中的bbox
參數(shù)設(shè)置來調(diào)節(jié)圖像信息.
首先參考之前的例子, 我們先繪制圖像基本信息:
調(diào)整坐標(biāo)
然后對(duì)被遮擋的圖像調(diào)節(jié)相關(guān)透明度,本例中設(shè)置 x軸 和 y軸 的刻度數(shù)字進(jìn)行透明度設(shè)置
其中l(wèi)abel.set_fontsize(12)重新調(diào)節(jié)字體大小,bbox設(shè)置目的內(nèi)容的透明度相關(guān)參,facecolor調(diào)節(jié) box 前景色,edgecolor 設(shè)置邊框, 本處設(shè)置邊框?yàn)闊o,alpha設(shè)置透明度. 最終結(jié)果如下:
散點(diǎn)圖
首先,先引入matplotlib.pyplot簡寫作plt,再引入模塊numpy用來產(chǎn)生一些隨機(jī)數(shù)據(jù)。生成1024個(gè)呈標(biāo)準(zhǔn)正態(tài)分布的二維數(shù)據(jù)組 (平均數(shù)是0,方差為1) 作為一個(gè)數(shù)據(jù)集,并圖像化這個(gè)數(shù)據(jù)集。每一個(gè)點(diǎn)的顏色值用T來表示:
數(shù)據(jù)集生成完畢,現(xiàn)在來用scatterplot這個(gè)點(diǎn)集,鼠標(biāo)點(diǎn)上去,可以看到這個(gè)函數(shù)的各個(gè)parameter的描述,如下圖:
輸入X和Y作為location,size=75,顏色為T,color map用默認(rèn)值,透明度alpha 為 50%。 x軸顯示范圍定位(-1.5,1.5),并用xtick()函數(shù)來隱藏x坐標(biāo)軸,y軸同理:
今天的柱狀圖分成上下兩部分,每一個(gè)柱體上都有相應(yīng)的數(shù)值標(biāo)注,并且取消坐標(biāo)軸的顯示。
生成基本圖形
向上向下分別生成12個(gè)數(shù)據(jù),X為 0 到 11 的整數(shù) ,Y是相應(yīng)的均勻分布的隨機(jī)數(shù)據(jù)。使用的函數(shù)是plt.bar
,參數(shù)為X和Y:
這樣我們就生成了下圖所示的柱狀圖基本框架:
現(xiàn)在的結(jié)果呈現(xiàn):
接下來我們用函數(shù)plt.text分別在柱體上方(下方)加上數(shù)值,用%.2f保留兩位小數(shù),橫向居中對(duì)齊ha='center',縱向底部(頂部)對(duì)齊va='bottom':
最終的結(jié)果就像開始一樣:
畫等高線
數(shù)據(jù)集即三維點(diǎn) (x,y) 和對(duì)應(yīng)的高度值,共有256個(gè)點(diǎn)。高度值使用一個(gè) height function f(x,y) 生成。 x, y 分別是在區(qū)間 [-3,3] 中均勻分布的256個(gè)值,并用meshgrid在二維平面中將每一個(gè)x和每一個(gè)y分別對(duì)應(yīng)起來,編織成柵格:
接下來進(jìn)行顏色填充。使用函數(shù)plt.contourf把顏色加進(jìn)去,fill, 位置參數(shù)分別為:X, Y, f(X,Y)。透明度0.75,并將 f(X,Y) 的值對(duì)應(yīng)到color map的暖色組中尋找對(duì)應(yīng)顏色。8代表等高線的個(gè)數(shù)。
接下來進(jìn)行等高線繪制。使用plt.contour函數(shù)劃線。位置參數(shù)為:X, Y, f(X,Y)。顏色選黑色,線條寬度選0.5。現(xiàn)在的結(jié)果如下圖所示,只有顏色和線條,還沒有數(shù)值Label:
添加高度數(shù)字
其中,8代表等高線的密集程度,這里被分為10個(gè)部分。如果是0,則圖像被一分為二。
最后加入Label,inline控制是否將Label畫在線里面,字體大小為10。并將坐標(biāo)軸隱藏:
隨機(jī)矩陣畫圖
這一節(jié)我們講解怎樣在matplotlib中打印出圖像。這里我們打印出的是純粹的數(shù)字,而非自然圖像。 我們今天用這樣 3x3 的 2D-array 來表示點(diǎn)的顏色,每一個(gè)點(diǎn)就是一個(gè)pixel。
colorbar
下面我們添加一個(gè)colorbar ,其中我們添加一個(gè)shrink參數(shù),使colorbar的長度變短為原來的92%:
3D
首先在進(jìn)行 3D Plot 時(shí)除了導(dǎo)入 matplotlib ,還要額外添加一個(gè)模塊,即 Axes 3D 3D 坐標(biāo)軸顯示:
之后要先定義一個(gè)圖像窗口,在窗口上添加3D坐標(biāo)軸,顯示成下圖:
接下來給進(jìn) X 和 Y 值,并將 X 和 Y 編織成柵格。每一個(gè)(X, Y)點(diǎn)對(duì)應(yīng)的高度值我們用下面這個(gè)函數(shù)來計(jì)算。
其中,rstride 和 cstride 分別代表 row 和 column 的跨度。
下面兩個(gè)圖分別是跨度為1 和 5 的效果:
投影
下面添加 XY 平面的等高線:
如果 zdir 選擇了x,那么效果將會(huì)是對(duì)于 XZ 平面的投影,效果如下
range()函數(shù)的用法如下:
(1)range(stop)
創(chuàng)建一個(gè)(0,stop)之間的整數(shù)序列,步長為1。
(2)range(start,stop)
創(chuàng)建一個(gè)(start,stop)之間的整數(shù)序列,步長為1。
(3)range(start,stop,step)
創(chuàng)建一個(gè)[start,stop)之間的整數(shù)序列,步長為step。
參數(shù)介紹:
start:表示從返回序列的起始編號(hào),默認(rèn)情況下從0開始。
stop:表示生成最多但不包括此數(shù)字的數(shù)字。
step:指的是序列中每個(gè)數(shù)字之間的差異,默認(rèn)值為1。
range()是Python的內(nèi)置函數(shù),在用戶需要執(zhí)行特定次數(shù)的操作時(shí)使用它,表示循環(huán)的意思。內(nèi)置函數(shù)range()可用于以列表的形式生成數(shù)字序列。在range()函數(shù)中最常見用法是使用for和while循環(huán)迭代序列類型(List,string等)。
簡單的來說,range()函數(shù)允許用戶在給定范圍內(nèi)生成一系列數(shù)字。根據(jù)用戶傳遞給函數(shù)的參數(shù)數(shù)量,用戶可以決定該系列數(shù)字的開始和結(jié)束位置以及一個(gè)數(shù)字與下一個(gè)數(shù)字之間的差異有多大。
在前面,我們要保存一個(gè)數(shù)據(jù),需要先定義一個(gè)變量,而且一個(gè)變量中只能保存一個(gè)數(shù)據(jù)。譬如,語句:a1=1,值“1”就被保存了,但要保存“2”,就還需要再定義一個(gè)變量:a2=2......這樣以來,隨著數(shù)據(jù)的增多,豈不是要定義更多的變量嗎?
可以使用一個(gè)新的數(shù)據(jù)類型,它記錄很多數(shù)據(jù),并且將它們按照順序存儲(chǔ)在連續(xù)的內(nèi)存空間中,這便是序列。Python中有5種常用的序列結(jié)構(gòu),分別是列表、元組、集合、字典和字符串。
9.1列表
語法格式:
listname=[element1,element2,element3,......,elementn]
其中,listname為列表名,element1,element2,element3,......,elementn表示列表中的元素。各個(gè)元素的數(shù)據(jù)類型可以相同,也可以不同,但通常元素的類型都是相同的,含義也是相同的。
如:
list1=[‘風(fēng)’,’馬‘,’?!?1,2,3,’a’,’b’,’c’]就沒有太多的實(shí)際用途。
list2=['張三','男',18,'13901001000']雖然元素的類型不同,但表示了同一個(gè)人的信息。
1、訪問列表元素
列表中元素的索引號(hào)從0開始標(biāo)記,訪問列表元素時(shí),可以直接按照索引號(hào)讀取。
如:
list2=['張三','男',18,'13901001000']
print(list2[1]) #輸出列表中索引號(hào)為1的元素
輸出結(jié)果:男
和字符串一樣,序列都是可以使用切片操作的。
如:
print(list2[:2])
輸出結(jié)果:['張三', '男']
print(list2[2:])
輸出結(jié)果:[18, '13901001000']
2、使用range()函數(shù)創(chuàng)建數(shù)值列表
格式:range(start, stop [,step]) ;start 指的是計(jì)數(shù)起始值,默認(rèn)是 0;stop 指的是計(jì)數(shù)結(jié)束值,但不包括 stop ;step 是步長,默認(rèn)為 1,不可以為 0 。range() 方法生成一段左閉右開的整數(shù)范圍。
可以使用range()函數(shù)創(chuàng)建數(shù)值列表,如:
list1=list(range(10,20,2))
print(list1)
運(yùn)行結(jié)果:[10, 12, 14, 16, 18]
3、刪除列表
語法格式如下:
del listname
其中,listname為要?jiǎng)h除列表的名稱。
刪除列表與刪除變量的方法是完全一樣的,前面已經(jīng)介紹過了。
4、遍歷列表
常用的遍歷列表的方法有是利用for語句,舉例如下:
list1=list(range(10))
for item in list1:
print(item,end=' ') # end=’ ‘表示以空格結(jié)束,如果不寫這個(gè)參數(shù),相當(dāng)于默認(rèn)值end=’ ’
輸出結(jié)果:0 1 2 3 4 5 6 7 8 9
為了獲取列表元素的索引值,就需要使用enumerate()函數(shù)。
list1=list(range(10,20,2))
for index,item in enumerate(list1):
print(index,'-',item,end=' ')
輸出結(jié)果:0 - 10 1 - 12 2 - 14 3 - 16 4 - 18
5、追加、修改和刪除列表元素
追加元素
list1=['春','夏','秋']
list1.append('冬')
list1
['春', '夏', '秋', '冬']
還有一種方法,就是使用“+”號(hào)將兩個(gè)序列連接起來。如:
list1=['春','夏','秋']
list1=list1+['冬']
print(list1)
輸出結(jié)果為:['春', '夏', '秋', '冬']
注意,下面的做法是錯(cuò)誤的:
list1=['春','夏','秋']
list1=list1+'冬'
Traceback (most recent call last):
File " ", line 1, in
list1=list1+'冬'
TypeError: can only concatenate list (not "str") to list
從這個(gè)提示可知,列表只能與列表連接,而不能與字符串連接。
修改元素
list1[2]='autumn' #通過索引對(duì)元素直接賦值
print(list1)
['春', '夏', 'autumn', '冬']
刪除元素
del list1[2] #通過索引直接刪除元素
print(list1)
['春', '夏', '冬']
6、列表元素排序
在討論列表元素排序時(shí),為了將有序列表變成無序列表,這里用到了shuffle()函數(shù),但它不是Python的內(nèi)置函數(shù),需要先使用import語句將random模塊包含進(jìn)來,這樣才能像使用內(nèi)置函數(shù)那樣使用擴(kuò)展模塊中的函數(shù)。
import random #導(dǎo)入random模塊
list1=list(range(10)) #生成列表,元素為0到9的整數(shù)。
list1
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
random.shuffle(list1) #用random包中的shuffle()函數(shù)將list1中元素次序打亂
list1
[8, 6, 3, 5, 0, 7, 1, 9, 2, 4]
list1.sort() #對(duì)list1升序排列
list1
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
random.shuffle(list1) #將list1順序重新打亂
list1
[5, 9, 7, 8, 4, 3, 2, 0, 6, 1]
list1.sort(reverse=True) #對(duì)list1降序排列
list1
[9, 8, 7, 6, 5, 4, 3, 2, 1, 0]
方法sort()的語法格式:
listname.sort(key=None,reverse=False)
其中,listname表示要排序的列表;key表示指定一個(gè)鍵,如”key=str.lower”表示排序時(shí)不區(qū)分字母大小寫;reverse為True表示降序排列(為默認(rèn)值,可省缺),為False表示升序排列。
還有一個(gè)函數(shù)sorted(),功能與方法sort()相似。格式如下:
sorted(listname,key=None,reverse=False)
7、 利用列表推導(dǎo)式快速生成一個(gè)列表
例1:生成指定范圍的數(shù)值列表。
import random
list1=[random.randint(0,20) for i in range(10)]
list1
[16, 20, 19, 6, 5, 7, 10, 5, 12, 5] #生成了包含10個(gè)值在0到20之間的元素構(gòu)成的列表。
例2:根據(jù)現(xiàn)有列表生成新的列表。
radius=list(range(1,6)) #生成列表 radius保存半徑的值
radius
[1, 2, 3, 4, 5]
s=[round(2*3.14*r,2) for r in radius]
#生成列表s,將計(jì)算得到的周長值保存起來,其中round()可以保留指定小數(shù)位,格式 round(var, n),var為變量名,n為指定保留小數(shù)位。
s
[6.28, 12.56, 18.84, 25.12, 31.4]
例3:從列表中選擇符合條件的元素組成新的列表。
score=[98,65,77,56,82,89] #列表score用來存儲(chǔ)成績
good=[x for x in score if x=80]
#從列表score中選取=80的元素存入新列表good中
good
[98, 82, 89]
count()、index()和sum()方法
count()方法
用于統(tǒng)計(jì)指定元素在列表中出現(xiàn)的次數(shù)。
例:
list1=['a','b','c','d','e','f','c','d','e','a','b','c','d']
num=list1.count('c') #統(tǒng)計(jì)列表list1中'c'的個(gè)數(shù)
num
3
index()方法
用于獲取指定元素在列表中第一次出現(xiàn)的索引值。
list1=['a','b','c','d','e','f','c','d','e','a','b','c','d']
position=list1.index('c')
position
2
sum()方法
用于計(jì)算數(shù)值列表中全部或指定元素的和。
list1=[1,2,3,4,5]
total=sum(list1) #計(jì)算列表list1中全部元素的和
total
15
total=sum(list1,1) #在列表list1全部元素的和后,在加上參數(shù)(“1”)的值
total
16
total=sum(list1[:2]) #計(jì)算切片list1[:2]中各元素的和
total
3
二維列表
格式:listname[下標(biāo)1][下標(biāo)2]
其中,listname表示列表的名稱,下標(biāo)1表示列表中的行號(hào),下標(biāo)2表示列表中的列號(hào)。對(duì)于n行m列的二維列表,第一個(gè)元素的行號(hào)和列號(hào)都是0,最后一個(gè)元素的行號(hào)和列號(hào)都是n-1。如下所示:
list[0][0] list[0][1] list[0][2] ............ list[0][m-1]
list[1][0] list[1][1] list[1][2] ............ list[1][m-1]
......
......
list[n-1][0] list[n-1][1] list[n-1][2] ............ list[n-1][m-1]
通俗地講,如果一個(gè)列表中的元素本身就是一個(gè)列表,則這個(gè)列表就是一個(gè)二維列表。
如:
list1=['a1','b1','c1','d1']
list2=['a2','b2','c2','d2']
list3=['a3','b3','c3','d3']
listtwo=[list1,list2,list3]
listtwo
[['a1', 'b1', 'c1', 'd1'], ['a2', 'b2', 'c2', 'd2'], ['a3', 'b3', 'c3', 'd3']]
如果要查看二維列表listtwo按照行、列的排列,可以運(yùn)行如下代碼:
for i in range(3):
for j in range(4):
print(listtwo[i][j],end=' ')
print()
運(yùn)行結(jié)果:
a1 b1 c1 d1
a2 b2 c2 d2
a3 b3 c3 d3
如果要讀取二維列表中的某一行,可以使用如下方法:
listtwo[2] #讀取第3行的元素(注意索引號(hào)都是從0開始的)
['a3', 'b3', 'c3', 'd3']
如果要讀取某一個(gè)元素的值,可以使用如下方法:
listtwo[2][2] #讀取第3行第3列的元素
'c3'
python 的函數(shù)參數(shù)類型分為4種:
1.位置參數(shù):調(diào)用函數(shù)時(shí)根據(jù)函數(shù)定義的參數(shù)位置來傳遞參數(shù),位置參數(shù)也可以叫做必要參數(shù),函數(shù)調(diào)用時(shí)必須要傳的參數(shù)。
當(dāng)參數(shù)滿足函數(shù)必要參數(shù)傳參的條件,函數(shù)能夠正常執(zhí)行:
add(1,2) #兩個(gè)參數(shù)的順序必須一一對(duì)應(yīng),且少一個(gè)參數(shù)都不可以
當(dāng)我們運(yùn)行上面的程序,輸出:
當(dāng)函數(shù)需要兩個(gè)必要參數(shù),但是調(diào)用函數(shù)只給了一個(gè)參數(shù)時(shí),程序會(huì)拋出異常
add(1)
當(dāng)我們運(yùn)行上面的程序,輸出:
當(dāng)函數(shù)需要兩個(gè)必要參數(shù),但是調(diào)用函數(shù)只給了三個(gè)參數(shù)時(shí),程序會(huì)拋出異常
add(1,2,3)
當(dāng)我們運(yùn)行上面的程序,輸出
2.關(guān)鍵字參數(shù):用于函數(shù)調(diào)用,通過“鍵-值”形式加以指定??梢宰尯瘮?shù)更加清晰、容易使用,同時(shí)也清除了參數(shù)的順序需求。
add(1,2) # 這種方式傳參,必須按順序傳參:x對(duì)應(yīng)1,y對(duì)應(yīng):2
add(y=2,x=1) #以關(guān)健字方式傳入?yún)?shù)(可以不按順序)
正確的調(diào)用方式
add(x=1, y=2)
add(y=2, x=1)
add(1, y=2)
以上調(diào)用方式都是允許的,能夠正常執(zhí)行
錯(cuò)誤的調(diào)用方式
add(x=1, 2)
add(y=2, 1)
以上調(diào)用都會(huì)拋出SyntaxError 異常
上面例子可以看出:有位置參數(shù)時(shí),位置參數(shù)必須在關(guān)鍵字參數(shù)的前面,但關(guān)鍵字參數(shù)之間不存在先后順序的
3.默認(rèn)參數(shù):用于定義函數(shù),為參數(shù)提供默認(rèn)值,調(diào)用函數(shù)時(shí)可傳可不傳該默認(rèn)參數(shù)的值,所有位置參數(shù)必須出現(xiàn)在默認(rèn)參數(shù)前,包括函數(shù)定義和調(diào)用,有多個(gè)默認(rèn)參數(shù)時(shí),調(diào)用的時(shí)候,既可以按順序提供默認(rèn)參數(shù),也可以不按順序提供部分默認(rèn)參數(shù)。當(dāng)不按順序提供部分默認(rèn)參數(shù)時(shí),需要把參數(shù)名寫上
默認(rèn)參數(shù)的函數(shù)定義
上面示例第一個(gè)是正確的定義位置參數(shù)的方式,第二個(gè)是錯(cuò)誤的,因?yàn)槲恢脜?shù)在前,默認(rèn)參數(shù)在后
def add1(x=1,y) 的定義會(huì)拋出如下異常
默認(rèn)參數(shù)的函數(shù)調(diào)用
注意:定義默認(rèn)參數(shù)默認(rèn)參數(shù)最好不要定義為可變對(duì)象,容易掉坑
不可變對(duì)象:該對(duì)象所指向的內(nèi)存中的值不能被改變,int,string,float,tuple
可變對(duì)象,該對(duì)象所指向的內(nèi)存中的值可以被改變,dict,list
這里只要理解一下這個(gè)概念就行或者自行百度,后續(xù)會(huì)寫相關(guān)的專題文章講解
舉一個(gè)簡單示例
4.可變參數(shù)區(qū)別:定義函數(shù)時(shí),有時(shí)候我們不確定調(diào)用的時(shí)候會(huì)多少個(gè)參數(shù),j就可以使用可變參數(shù)
可變參數(shù)主要有兩類:
*args: (positional argument) 允許任意數(shù)量的可選位置參數(shù)(參數(shù)),將被分配給一個(gè)元組, 參數(shù)名前帶*,args只是約定俗成的變量名,可以替換其他名稱
**kwargs:(keyword argument) 允許任意數(shù)量的可選關(guān)鍵字參數(shù),,將被分配給一個(gè)字典,參數(shù)名前帶**,kwargs只是約定俗成的變量名,可以替換其他名稱
*args 的用法
args 是用來傳遞一個(gè)非鍵值對(duì)的可變數(shù)量的參數(shù)列表給函數(shù)
語法是使用 符號(hào)的數(shù)量可變的參數(shù); 按照慣例,通常是使用arg這個(gè)單詞,args相當(dāng)于一個(gè)變量名,可以自己定義的
在上面的程序中,我們使用* args作為一個(gè)可變長度參數(shù)列表傳遞給add()函數(shù)。 在函數(shù)中,我們有一個(gè)循環(huán)實(shí)現(xiàn)傳遞的參數(shù)計(jì)算和輸出結(jié)果。
還可以直接傳遞列表或者數(shù)組的方式傳遞參數(shù),以數(shù)組或者列表方式傳遞參數(shù)名前面加(*) 號(hào)
理解* * kwargs
**kwargs 允許你將不定長度的鍵值對(duì), 作為參數(shù)傳遞給函數(shù),這些關(guān)鍵字參數(shù)在函數(shù)內(nèi)部自動(dòng)組裝為一個(gè)dict
下篇詳細(xì)講解 *args, **kwargs 的參數(shù)傳遞和使用敬請(qǐng)關(guān)注