主要用于作圖、可視化問題
安裝
pip install matplotlib
導(dǎo)入模塊
# 下面兩種二選一,第二種比較常用
from matplotlib import pylab
# 導(dǎo)入pyplot+numpy
import matplotlib.pyplot as plt
# 僅導(dǎo)入pyplot
導(dǎo)入模塊pyplot
和pylab
,可以參考下面鏈接觀察兩者區(qū)別:
https://www.cnblogs.com/Shoesy/p/6673947.html
(說白了就是pylay=pyplot+numpy)
圖片中文亂碼問題
輸入這三行解決
from pylab import mpl
mpl.rcParams['font.sans-serif'] = ['FangSong'] # 指定默認(rèn)字體
mpl.rcParams['axes.unicode_minus'] = False # 解決保存圖像是負(fù)號'-'顯示為方塊的問題
常用圖形
折線/散點圖
主要使用plot()
來展示杭措,里面前兩個參數(shù)代表x
视搏,y
坐標(biāo)(注意x,y數(shù)量要一樣)盟广,第三個參數(shù)可以用來設(shè)置散點圖('o'
)或者顏色、線條形式等各種樣式瓮钥,并且第三個參數(shù)可以同時傳入多個筋量,比如要紅色的散點圖就:'0r'
(1)顏色樣式:
青 c(cyan)
紅 r
品紅 m(magente)
綠 g
藍(lán) b
黃 y
黑 k
白 w
(2)線條樣式:
- 直線
-- 虛線
-. 就是這個樣
: 細(xì)小虛線(就是`...`)
(3)點的樣式:
s 方形
h 六角形(比大寫的細(xì)一點)
H 六角形
* 星形
+ 加號
x x形
d 菱形
D 菱形(和上面的些微不一樣)
p 五邊形
(4)坐標(biāo)區(qū)間:
plt.axis([-10, 10, 0, 2])
#x軸從-10到10,y軸0到2
或者分別設(shè)置x碉熄、y的區(qū)間:
plt.xlim(-10,10)
#設(shè)置x范圍在-10到10
plt.ylim(0,2)
#設(shè)置y范圍在0到2
注:
設(shè)置點的樣式時默認(rèn)就是散點圖桨武,以及同類樣式只能設(shè)置一個(比如不能設(shè)置兩種顏色),并且還可以把多個圖集合在一起展示锈津,那就多plot
幾個呀酸,plot就相當(dāng)于一個畫布,每plot一個就相當(dāng)于在上面畫一張圖琼梆,再弄就繼續(xù)在上面畫
實際舉例
x = [1,3,5,2,4]
y = [2,4,5,1,3]
plt.plot(x, y) #將x性誉,y軸坐標(biāo)數(shù)據(jù)傳入,第三個參數(shù)是展現(xiàn)形式茎杂,默認(rèn)是折線圖
plt.plot(x, y, 'ok') #黑色散點圖
plt.xlim(0,10) #設(shè)置x范圍在0到10
plt.ylim(0,10) #設(shè)置y范圍在0到10
plt.title("show") #設(shè)置標(biāo)題名错览,在中上方
plt.xlabel("num") #設(shè)置x軸名稱,在中下方
plt.ylabel("age") #設(shè)置y軸名稱煌往,在中左方
plt.show() #可視化顯示數(shù)據(jù)倾哺,注意show了之后畫布就被清空了,前面的內(nèi)容下次就show不出來了
直方圖
主要用hist()
來顯示刽脖,實現(xiàn)方式很簡單羞海,把一組數(shù)據(jù)放入括號里就行了,例如隨機(jī)生成一堆正態(tài)分布的數(shù)曲管,然后直方圖顯示:
data = numpy.random.normal(0, 1, 10000000) #隨機(jī)生成這么多個符合正態(tài)分布的數(shù)
style = numpy.arange(-3, 3, 0.01)
#從-3到3按0.01為間隔的格式却邓,如果不設(shè)格式,弄出來一點都不像
plt.hist(data, style)
plt.show()
其中如果要設(shè)置直方圖格式(寬度翘地、上下限申尤、是否要輪廓)可以這樣:
x = numpy.random.random_integers(0, 100, 100) #隨機(jī)生成100個上下限為0到100的數(shù)
style = numpy.arange(1, 100, 2) #在1到100內(nèi)癌幕,階值為2
plt.hist(x, style, histtype='stepfilled')
#生成相應(yīng)樣式直方圖,前面的樣式可以看作范圍是1到100里
#直方圖的每條柱子寬度為2的意思
#第三個參數(shù)是不要輪廓的意思昧穿,默認(rèn)是有
plt.show()
#實際上你會發(fā)現(xiàn)只有1到99的數(shù)據(jù)勺远,因為99+2>100,而100要和101的數(shù)據(jù)在一起才能顯示
#所以除非有101时鸵,才能顯示100-101的數(shù)據(jù)
注:
直方圖和折線圖這些不太一樣胶逢,折線圖是傳入兩個等長數(shù)據(jù),然后每個x饰潜、y坐標(biāo)一一對應(yīng)展示出來初坠。而直方圖是:第一個參數(shù)代表你傳入的所有數(shù)據(jù),第二個參數(shù)代表你傳入的x軸范圍彭雾,然后直方圖會將第一個參數(shù)里傳入的數(shù)據(jù)一個個計算在某個范圍內(nèi)含有的數(shù)據(jù)量碟刺,因此傳入的兩個參數(shù)數(shù)據(jù)不一定要等長,例如下面的例子:
x = [1,2,2.5,3,4,5]
# 傳入一堆數(shù)據(jù)(6個)
y = [1,2,3,4,5]
# 傳入范圍為1-5薯酝,其中:
# 1-2有1個(1)
# 2-3有2個(2半沽、2.5)
# 3-4有1個
# 4-5有2個
plt.hist(x, y)
plt.show()
結(jié)果如圖:
可以看出數(shù)據(jù)被自動分配到對應(yīng)的范圍內(nèi)上了
子圖
使用subplot(row, col, area)
:三個參數(shù)分別是行數(shù)、列數(shù)和區(qū)域吴菠,比如要將原圖分成2行2列(切成4份)者填,然后要左下角那個圖就:
plt.figure(figsize=(10, 50))
# figure設(shè)置子圖排列尺寸,間距10做葵,尺寸為50*50
plt.subplot(2, 2, 3)
plt.show()
如果想4個圖都顯示就4個subplot
占哟,分別1、2酿矢、3榨乎、4就行了,然后在各圖的subplot之后寫的都是每個圖的內(nèi)容瘫筐,現(xiàn)在我們試試弄一個2行谬哀,第一行兩列的圖片(想象下鼠標(biāo)的樣子),而且分別是不同的內(nèi)容:
plt.subplot(2,2,1) #2行兩列的第一個圖严肪,內(nèi)容為1到100遞增為5的直方圖
x = numpy.arange(1,100,5)
plt.hist(x)
plt.subplot(2,2,2) #兩行兩列的第二個圖,內(nèi)容為100個符合正態(tài)分布數(shù)的直方圖
y = numpy.random.normal(0,1,100)
plt.hist(y)
plt.subplot(2,1,2) #兩行一列的第二個圖谦屑,此時會把上面兩個圖合起來看出兩行一列的第一個圖驳糯,而當(dāng)前圖看成第二個圖,內(nèi)容為一個折線圖
z = [[1,2,3,4,5],[1,5,3,2,4]]
plt.plot(z[0],z[1],'k')
plt.show() #展示這三個圖
餅狀圖
示例
from matplotlib import pyplot as plt
#調(diào)節(jié)圖形大小氢橙,寬酝枢,高
plt.figure(figsize=(6,9))
#定義餅狀圖的標(biāo)簽,標(biāo)簽是列表
labels = [u'第一部分',u'第二部分',u'第三部分']
#每個標(biāo)簽占多大悍手,會自動去算百分比
sizes = [60,30,10]
colors = ['red','yellowgreen','lightskyblue']
#將某部分出來帘睦,使用括號袍患,將第一塊分割出來,數(shù)值的大小是分割出來的與其他兩塊的間隙
explode = (0.05,0,0)
patches,l_text,p_text = plt.pie(sizes,explode=explode,labels=labels,colors=colors, \
labeldistance = 1.1,autopct = '%3.1f%%',shadow = False, startangle = 90,pctdistance = 0.6)
#labeldistance竣付,文本的位置離遠(yuǎn)點有多遠(yuǎn)诡延,1.1指1.1倍半徑的位置
#autopct,圓里面的文本格式古胆,%3.1f%%表示小數(shù)有三位肆良,整數(shù)有一位的浮點數(shù)
#shadow,餅是否有陰影
#startangle逸绎,起始角度惹恃,0,表示從0開始逆時針轉(zhuǎn)棺牧,為第一塊巫糙。一般選擇從90度開始比較好看
#pctdistance,百分比的text離圓心的距離
#patches, l_texts, p_texts颊乘,為了得到餅圖的返回值参淹,p_texts餅圖內(nèi)部文本的,l_texts餅圖外label的文本
#改變文本的大小
#方法是把每一個text遍歷疲牵。調(diào)用set_size方法設(shè)置它的屬性
for t in l_text:
t.set_size=(30)
for t in p_text:
t.set_size=(20)
# 設(shè)置x承二,y軸刻度一致,這樣餅圖才能是圓的
plt.axis('equal')
plt.legend()
plt.show()
注:
labels
纲爸、sizes
亥鸠、colors
和explode
的長度都要一樣
3D圖
1.導(dǎo)入3D圖相關(guān)模塊:
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
2.將畫圖板加到3D模塊里,然后加入數(shù)據(jù)即可:
fig = plt.figure()
ax = Axes3D(fig)
ax.scatter(x, y, z)
plt.show()
3D散點圖舉例:
from random import randint
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
li_xyz = [(randint(0, 100), randint(0, 100), randint(0, 100)) for i in range(100)]
x, y, z = zip(*li_xyz)
fig = plt.figure()
ax = Axes3D(fig)
ax.scatter(x, y, z)
plt.show()
讀取圖片
通過imread()
讀取识啦,舉例:
from matplotlib.image import imread
file = r'2.jpg'
img = imread(file)
plt.imshow(img)
plt.show()