1. 什么是Matplotlib
Matplotlib 是一個 Python 的 2D 繪圖庫耀销,通過 Matplotlib ,開發(fā)者可以僅需要幾行代碼,便可以生成折線圖,直方圖琉朽,條形圖,餅狀圖稚铣,散點圖等箱叁。
2. 安裝和基本使用
安裝很簡單。
如果是用的自己安裝的python解釋器榛泛,那直接pip install matplotlib就可以安裝蝌蹂。
如果是用 Anaconda 噩斟,可以通過 conda install matplotlib 曹锨,也可以通過 pip install matplotlib 進行安裝。
基本使用剃允,首先先看以下例子:
import matplotlib.pyplot as plt
import numpy as np
y1 = [np.random.randint(0,10) for x in range(20)]
x1 = range(5,25)
plt.plot(x1,y1)
在jupyter里面運行就會出現(xiàn)以下圖:
在pycharm里面這個要加上plt.show()才可以出圖:
所以做數(shù)據(jù)分析建議最好還是用交互式的jupyter noterbok沛简,它既簡潔又能保存中間結(jié)果,看起來也更直觀方便斥废。
3.點線縮寫和顏色的選擇
import matplotlib.pyplot as plt
import numpy as np
y1 = [np.random.randint(0,10) for x in range(20)]
x1 = range(5,25)
plt.plot(x1,y1)
下面我們再看一下這段代碼椒楣,其中 plot 是一個畫圖的函數(shù),它的參數(shù)為 plot([x],y,[fmt],data=None,**kwargs)
牡肉。其中fmt
可以傳一個字符串捧灰,用來給這個圖做一些樣式修改的。默認(rèn)的繪制樣式是 b-
统锤,也就是藍(lán)色實體線條毛俏。b就是英文blue藍(lán)色的縮寫。
點線縮寫還有以下的:
除了設(shè)置線條的形狀外饲窿,我們還可以設(shè)置點的顏色煌寇,給線條設(shè)置顏色總體來說有三種方式:
- 第一種是使用顏色名稱( r 是 red 的縮寫)的形式;
- 第二種是使用十六進制的方式逾雄;
- 第三種是使用 RGB 或 RGBA 的方式阀溶。
示例:
plt.plot([1,2,3,4,5],[1,2,3,4,5],'r') #將顏色線條設(shè)置成紅色
plt.plot([1,2,3,4,5],[1,2,3,4,5],color='red') #將顏色設(shè)置成紅色
plt.plot([1,2,3,4,5],[1,2,3,4,5],color='#000000') #將顏色設(shè)置成純黑色
plt.plot([1,2,3,4,5],[1,2,3,4,5],color=(0,0,0,0)) #將顏色設(shè)置成純黑色
最簡單的還是第一種,其他的還得查RGB顏色對照表鸦泳,雖然顏色種類更多银锻,但如果沒有必要,還是簡單的用顏色名稱這種方法更好記:
如果使用的是顏色名稱做鹰,那么可以和線的形狀寫在同一個字符串中击纬。比如使用紅色的五角點,那么可以使用如下的方式實現(xiàn):
那如果我想將原來的圖的線條改成紅色虛線狀誊垢,那么可以通過以下代碼實現(xiàn):
y1 = [np.random.randint(0,10) for x in range(20)]
x1 = range(5,25)
plt.plot(x1,y1,"--",color='r')
小結(jié):
- plt.plot可以只傳Y軸的值掉弛,如果只傳Y軸的值症见,那么X軸就會默認(rèn)使用range(0,Y的長度)
- plt.plot的x和y參數(shù)不能夠作為關(guān)鍵字參數(shù)來傳遞,只能作為位置參數(shù)來傳殃饿。
- plt.plot中的data參數(shù)可以為一個字典或者DataFrame對象谋作,然后在x和y上指定這個列的名字,那么plot會自動讀取乎芳。這里有一個細(xì)節(jié)遵蚜,因為x,y,fmt都是在前面,所以如果只傳x和y奈惑,那么可能會產(chǎn)生歧義吭净,這時候我們可以多傳一個空的參數(shù)作為fmt的參數(shù),就不會有警告了肴甸。
- plt.plot的fmt參數(shù)可以設(shè)置線條的樣式以及顏色寂殉。
- plt.plot的color參數(shù)可以使用字母、十六進制原在,或者是RGBA的方式來設(shè)置顏色友扰。
- plt.plot函數(shù)的官方文檔
4. 設(shè)置圖的信息
現(xiàn)在我們添加圖后,沒有指定x軸代表什么庶柿,y軸代表什么村怪,以及這個圖的標(biāo)題是什么。因此以下我們通過一些屬性來設(shè)置一下浮庐。
4.1 設(shè)置線條樣式的方法
- 使用 plot 方法:
plot 方法就是用來繪制線條的甚负,因此可以在繪制的時候就把線條相關(guān)的樣式通過參數(shù)傳進去。
示例如下:
y = [np.random.randint(0,10) for x in range(10)]
plt.plot(y,lw=4,c='r',ls='--',aa=True)
比如linewidth表示線的寬度审残,簡寫為lw梭域;
c就是顏色color的首字母,r就是紅色red
ls即linestyle维苔,表示點線格式碰辅,我們這里用虛線展示。
- 通過 Line2D 對象來設(shè)置:
plot 方法會返回一個裝有 Line2D 對象的列表介时,比如 lines=plt.plot(x1,y1,x2,y2) 因為繪制了兩根線條没宾,因此 lines 中會有兩個 2D 對象。而如果 plot 只繪制一根線條沸柔,那么 lines 中就只有一個 Line2D 對象循衰。拿到這個 Line2D 對象后就可以通過 set_屬性名 設(shè)置線條的樣式了
示例:
y1 = [np.random.randint(0,10) for x in range(10)]
y2 = [np.random.randint(0,10) for x in range(10)]
lines = plt.plot(range(10),y1,range(10),y2)
line = lines[0]
line.set_color('r')
line.set_linewidth(4)
line.set_alpha(0.5)
- 使用 plt.setp 來設(shè)置: setp 的好處是一次性可以設(shè)置多根線條的樣式。
示例代碼如下:
y1 = [np.random.randint(0,10) for x in range(10)]
y2 = [np.random.randint(0,10) for x in range(10)]
lines = plt.plot(range(10),y1,range(10),y2)
plt.setp(lines,linewidth=4)
小結(jié):
- 使用plot繪圖的時候褐澎,就可以傳遞Line2D的屬性值進去会钝,來修改線條的樣式。
- 使用plot返回的線條,單獨去設(shè)置也可以迁酸,但是單獨設(shè)置的時候先鱼,是通過set_Line2D屬性名()的方式來設(shè)置的。
- 使用plt.setp來一次性設(shè)置多個線條的樣式奸鬓。
4. 2 設(shè)置軸和標(biāo)題
4.2.1 設(shè)置軸名稱
可以通過 plt.xlabel 和 plt.ylabel 來設(shè)置 x 軸和 y 軸的的名稱焙畔。
示例代碼如下:
plt.plot(x,y,linewidth=10,color='red')
plt.xlabel("x軸")
plt.ylabel("y軸")
默認(rèn)情況下是顯示不了中文的。需要設(shè)置字體串远。
在windows中要使用中文坐標(biāo)軸的話宏多,需要調(diào)用電腦中的字體,可以通過以下代碼來實現(xiàn):
# 加載字體
font = font_manager.FontProperties(fname="C:\Windows\Fonts\msyh.ttc")
plt.plot(x,y,linewidth=10,color='red')
plt.xlabel("x軸",fontproperties=font)
plt.ylabel("y軸",fontproperties=font)
加載字體的時候,可以到 C:\Windows\Fonts 中找你喜歡的并且可以顯示中文的字體澡罚。找到字體后伸但,還需要找到字體的真實名稱。
方法是右鍵->屬性->安全->對象名稱:
4.2.2 設(shè)置標(biāo)題
可以通過 plt.title 方法來實現(xiàn)留搔,比如設(shè)置中文標(biāo)題更胖,示例1:
import matplotlib.pyplot as plt
import numpy as np
from matplotlib import font_manager
y = [np.random.randint(10) for x in range(10)]
font = font_manager.FontProperties(fname=r"C:\\Windows\\Fonts\\msyh.ttc",size=20)
plt.plot(y)
plt.title("折線圖",fontproperties=font)
4.2.3 設(shè)置 x 軸和 y 軸的刻度
之前我們畫的圖, x 軸和 y 軸的刻度都是 matplotlib 自動生成的催式。
如果想要在生成圖的時候手動的指定函喉,那么可以通過 plt.xticks 和 plt.yticks 來實現(xiàn):
plt.xticks(range(0,20,2)) #在x軸上的刻度是0,2,4,6...20
以上會把那個刻度顯示在 x 軸上。如果想要顯示字符串類型荣月,那么可以再構(gòu)造一個數(shù)組,這個數(shù)組的長度必須和 x 軸刻度的長度保持一致梳毙。然后傳給 xticks 的第二個參數(shù)哺窄。示例代碼如下:
_x = range(0,20,2)
_xticks = ["%d坐標(biāo)"%i for i in _x]
plt.xticks(_x,_xticks,fontproperties=font) #在x軸上的刻度是0坐標(biāo),2坐標(biāo)...20坐標(biāo)
同樣 y 軸的刻度設(shè)置也是一樣的,將xticks換成yticks即可。
4.2.4 復(fù)仇者聯(lián)盟電影票房案例
實例展示账锹,復(fù)仇者聯(lián)盟電影票房案例:
avenger = [17974.4,50918.4,30033.0,40329.1,52330.2,19833.3,11902.0,24322.6,47521.8,32262.0,22841.9,12938.7,4835.1,3118.1,2570.9,2267.9,1902.8,2548.9,5046.6,3600.8]
plt.figure(figsize=(15,5))
plt.plot(avenger,marker="o")
font.set_size(10)
plt.xticks(range(20),["第%d天"%x for x in range(1,21)],fontproperties=font)
plt.xlabel("天數(shù)",fontproperties=font)
plt.ylabel("票房(單位:萬)",fontproperties=font)
plt.title("復(fù)仇者聯(lián)盟前20天票房數(shù)據(jù)",fontproperties=font)
plt.grid(True)
plt.show()
小結(jié)
- 標(biāo)題是通過plt.title來設(shè)置的萌业。
- 刻度是通過xticks和yticks來設(shè)置的。xticks和yticks需要傳遞兩個參數(shù)奸柬,第一個參數(shù)ticks不重要生年,只要跟數(shù)據(jù)量保持一致就可以了,比如有20個數(shù)據(jù)廓奕,那么只要產(chǎn)生20個數(shù)據(jù)的數(shù)組或者列表都可以抱婉,第二個參數(shù)labels是用來設(shè)置每個刻度上的文本顯示,這個就比較重了桌粉。
- 軸的名稱是通過xlabel和ylabel來設(shè)置的蒸绩。
- 默認(rèn)plot是不支持中文的,如果想要支持中文铃肯,那么應(yīng)該創(chuàng)建一個字體對象matplotlib.font_manager.FontProperties患亿,然后指定fname參數(shù),需要具體的路徑押逼。這里還有一個小細(xì)節(jié)步藕,拷貝出來的字體的字符串惦界,前面有一個亂碼,要把那個亂碼刪掉咙冗。獲取字體路徑的方式:右鍵->屬性->安全->對象名稱表锻。
5. 設(shè)置文本注釋和marker
5.1 設(shè)置marker
有時候,我們想要在一些關(guān)鍵點上重點標(biāo)記出來乞娄。那么我們可以通過設(shè)置 marker 來實現(xiàn)瞬逊。示例代碼如下:
x = np.linspace(0,20)
y = np.sin(x)
plt.plot(x,y,marker="o")
我們設(shè)置了 marker 為 o ,這樣就是會在 (x,y) 的坐標(biāo)點上顯示出來仪或,并且顯示的是圓點确镊。其中 o 跟之前的線條樣式的簡寫是一樣的。另外范删,還可以通過 markerfacecolor 屬性
和 markersize 來指定標(biāo)記點的顏色和大小蕾域。示例代碼如下:
# 以下設(shè)置標(biāo)記點的顏色為黑色,尺寸為10
plt.plot(x,y,marker="o",markerfacecolor='k',markersize=10)
5.2 設(shè)置注釋文本
有時候需要在圖形中的某個點標(biāo)記或者注釋一下到旦。那么我們可以使用 plt.annotate(text,xy,xytext,arrowprops={})
來實現(xiàn)旨巷,其中 text
是注釋的文本,xy
是需要注釋的點的坐標(biāo)添忘, xytext
是注釋文本的坐標(biāo)采呐, arrowprops
是箭頭的樣式屬性。示例代碼如下:
y = np.sin(np.arange(20))
plt.plot(y,marker='o')
# plt.annotate("(0,0)",xy=(0,0),xytext=(-0.5,-0.8),arrowprops={"width":10,"headwidth":16,"headlength":20,"shrink":0.3,"facecolor":"r","edgecolor":"y"})
for index,value in enumerate(y):
plt.annotate("(%d,%.2f)"%(index,value),xy=(index,value),xytext=(index-0.1,value-0.1))
plt.show()
# plt.savefig("./a.png") # 保存圖片
小結(jié)
- plt.plot的時候搁骑,可以通過marker參數(shù)設(shè)置坐標(biāo)點的樣式斧吐。markerfacecolor代表的是點的顏色,markeredgecolor代表的是點的邊界的顏色仲器,markersize代表的是點的大小煤率。
- plt.annotate(text,xy,xytext,arrowprops)是用來做文本注釋的,text代表的是需要注釋的文本乏冀,xy代表的是需要注釋的坐標(biāo)點蝶糯,xytext代表的是文本的坐標(biāo)點,arrowprops代表的是箭頭的一些屬性辆沦。
3.annotate的官方文檔
6. 設(shè)置圖形樣式
6.1 調(diào)整圖片的大小和像素
如果想要調(diào)整圖片的大小和像素昼捍,可以通過 plt.figure(num=None, figsize=None, dpi=None,facecolor=None, edgecolor=None, frameon=True)
來實現(xiàn)。
其中 num
是圖的編號众辨,figsize
的單位是英寸端三,dpi
是每英寸的像素點,facecolor
是圖片背景顏色鹃彻, edgecolor
是邊框顏色郊闯, frameon
代表是否繪制畫板。
示例代碼如下:
plt.figure(figsize=(10,5),facecolor="r",edgecolor="k",linewidth=2,dpi=200,frameon=True)
plt.plot(np.arange(5,20))
# plt.savefig("./x.png")
6.2 顯示圖片的網(wǎng)格
我們也可以使用 grid 方法,來顯示圖片的網(wǎng)格:
plt.figure(figsize=(10,5),facecolor="r",edgecolor="k",linewidth=2,dpi=200,frameon=True)
plt.plot(np.arange(5,20))
plt.grid()
6.3 繪制多個圖
繪制多個圖有兩種形式团赁,第一種形式是在一張圖中繪制多根線條育拨,第二種形式是繪制多個子圖形。
以下分別進行講解欢摄。
6.3.1 繪制多根折線
繪制多根線條熬丧,只要準(zhǔn)備好坐標(biāo),重新使用 plt.plot 繪制即可怀挠。示例代碼如下:
x = np.linspace(0,20)
plt.plot(x,np.sin(x))
plt.plot(x,np.cos(x))
6.3.2 繪制多個子圖
繪制子圖的時候析蝴,我們可以使用 plt.subplot 或 plt.subplots 來實現(xiàn)。示例代碼如下:
plt.subplot(221)
plt.plot(np.arange(10),c='r')
plt.subplot(222)
plt.plot(np.sin(np.arange(10)),c='b')
plt.subplot(223)
plt.plot(np.cos(np.arange(10)),c='y')
plt.subplot(224)
plt.plot(np.tan(np.arange(10)),c='g')
其中 subplot 中的 221 和 222 分別代表的意思是绿淋,第一個數(shù)表示這個大圖中總共有 2 行闷畸,第二個數(shù)表示總共有 2 列,然后第三個數(shù)表示當(dāng)前繪制第幾個圖吞滞。
也可以使用 fig,axs=plt.subplots(rows,cols,args,*kwargs) 來繪制多個圖形佑菩,返回值是一個元組,其中的 fig 參數(shù)是 figure 對象裁赠, axs 是 axes 對象的 array 殿漠。示例代碼如下:
values = np.linspace(0,20)
plt.style.use("seaborn")
fig,axes = plt.subplots(2,2,sharex=True) #Axes
ax1 = axes[0,0]
ax1.plot(values)
ax2 = axes[0,1]
ax2.plot(np.sin(values),c='y')
ax3 = axes[1,0]
ax3.plot(np.cos(values),c='b')
ax4 = axes[1,1]
ax4.plot(np.tan(values),c='g')
使用 subplot 和 subplots 都可以傳遞 sharex/sharey 參數(shù),這兩個參數(shù)表示是否需要共享X軸和Y軸佩捞。示例代碼如下:
figure,axes = plt.subplots(2,2,sharex=True,sharey=True)
axes[0,0].plot(np.sin(np.arange(10)),c='r')
axes[0,1].plot(np.cos(np.arange(10)),c='b')
axes[1,0].plot(np.tan(np.arange(10)),c='y')
axes[1,1].plot(np.arange(10),c='g')
小結(jié)
- 如果想要在一個圖上繪制多根折線绞幌,那么直接在plot中傳遞多個x和y就可以了,或者調(diào)用多次plot方法就可以了失尖。
- 如果想要在一個畫板上繪制多個子圖(Axes對象)啊奄,那么可以使用plt.subplot或plt.subplots方法。
- plt.subplot:plt.subplot(221)掀潮,第一個數(shù)字代表行,第二個數(shù)字代表列琼富,第三個數(shù)字代表當(dāng)前第幾個子圖仪吧。使用了subploth后繪制的所有東西都是在當(dāng)前子圖上,指導(dǎo)出現(xiàn)了新的subplot鞠眉。
- plt.subplots:fig,axes = plt.subplots(2,2,sharex=True)薯鼠,第一個代表行,第二個代表列械蹋,這個方法是一次性把所有的子圖都繪制了出皇,但是在子圖上沒有任何的東西,我們需要使用他的返回值來繪制哗戈,axes就是子圖的對象郊艘。
6.4 風(fēng)格設(shè)置
matplotlib 圖片默認(rèn)內(nèi)置了幾種風(fēng)格。我們可以通過 plt.style.available 來查看內(nèi)置的所有風(fēng)格:
在繪制的時候,可以使用 plt.style.use 方法來使用不同的風(fēng)格纱注。示例代碼如下:
plt.style.use("dark_background")
figure,axes = plt.subplots(2,2,sharex=True,sharey=True)
axes[0,0].plot(np.sin(np.arange(10)),c='r')
axes[0,1].plot(np.cos(np.arange(10)),c='b')
axes[1,0].plot(np.tan(np.arange(10)),c='y')
axes[1,1].plot(np.arange(10),c='g')
我將月亮縫入軀體畏浆,葬自我于山谷,如果那一天野花瘋長狞贱,那便是我在講
文章到此結(jié)束刻获,但愿本文對你能有一點幫助,歡迎三連瞎嬉,點個贊蝎毡,收個藏啥的,有問題的盡管砸來氧枣,我有故事你有酒沐兵,好好交流不分手!哈哈哈挑胸!下次見痒筒!