三種方法
讀圖: jin = plt.imread('./jinzhengen.png')
最小值 作為灰度值
jin_min = jin.min(axis=2)
最大值 作為灰度值
jin_max = jin.max(axis=2)
平均值 作為灰度值
jin_mean = jin.mean(axis=2)
加權平均值 作為灰度值 (使用最多)
weight = np.array([0.299,0.587,0.114]) # 權重jin_weight = np.dot(jin, weight)/3
Matplotlib基礎知識
Matplotlib中的基本圖表包括的元素
-
x軸和y軸 : 水平和垂直的軸線
-
x軸和y軸刻度 : 刻度標示坐標軸的分隔,包括最小刻度和最大刻度
-
x軸和y軸刻度標簽 : 表示特定坐標軸的值
-
繪圖區域 : 實際繪圖的區域
可以理解為 畫板(包含邊框), 畫布(繪圖區)
只含單一曲線的圖
plt.plot(x,y)
plt.plot(y) # 只給一個值,默認為y軸,以y數據索引0 到 N-1 作為x軸
包含多個曲線的圖
1、可以使用多個plot函數(推薦),在一個圖中繪制多個曲線 (碰到 plt.show() 函數結束本次繪圖)
plt.plot(x,y)
plt.plot(x,np.sin(x))
plt.show() # show方法顯示前面畫布的所有圖,之后畫圖會重建一個畫布
plt.plot(x,x)
2、也可以在一個plot函數中傳入多對X,Y值,在一個圖中繪制多個曲線
plt.plot(x,y,x,np.sin(x)) # x, y需成對出現
網格線
plt.grid(True) 方法為圖添加網格線
-
lw(linewidth) : 線的粗細
-
ls(linestyle): '-' ,'--' , '-.', ':'
-
alpha : 線的明暗程度
-
color : 顏色
-
which : major 主網格
-
axis: 'x' ,'y','both' 顯示哪方向網格線
plt.grid(which='major')
在一個畫布中畫多個子圖
方式1:
x= np.linspace(-20,20,200)
plt.figure(figsize=(3*5,4)) # 創建畫布 寬為15(一行三個子圖3*5), 高為4
axes1 = plt.subplot(1,3,1) # 創建子圖 一行三列第一個
axes1.plot(x,np.sin(x))
plt.grid()
axes2 = plt.subplot(1,3,2)
axes2.plot(x,np.sin(x))
plt.grid()
axes3 = plt.subplot(1,3,3)
axes3.plot(x,x**2)
plt.grid()
方式2:
坐標軸界限
axis方法
如果axis方法沒有任何參數,則返回當前坐標軸的上下限axis(xmin =,ymax = )
設置坐標軸類型:
plt.axis('equal')
-
'off': 關閉坐標軸
-
'equal': x,y軸刻度精度相等
-
'scaled': 效果和equal一樣,x,y軸刻度范圍一樣
xlim方法和ylim方法
除了plt.axis方法,還可以通過xlim,ylim方法設置坐標軸范圍
plt.plot(x,x**2)
plt.xlim(xmin=-1, xmax=1) # 關鍵字形式
plt.ylim((0,1)) # 還可以元組形式
坐標軸標簽
xlabel方法和ylabel方法
注意: plt.xlabel() 子圖使用: 對象.set_xlabel()
-
fontdict : 設置字體, 字典形式
-
-
c(color): 'r'
-
rotation 旋轉角度 (可寫字典外面)
-
position=(0,1)) (可寫字典外面)
-
x = np.linspace(-1,1,1000)
y = (1-x**2)**0.5
plt.plot(x,y,x,-y)
xlabel = plt.xlabel('x', fontdict=dict(fontsize=50, c='r',rotation=90)) # 直接參數設置
# xlabel.set_rotation(60) # 通過xlabel對象設置
plt.ylabel('y=(1-x^2)^0.5', fontdict=dict(fontsize=20), rotation=0, position=(0,1))
標題
注意: plt.title() 子圖使用: 對象.set_title()
-
loc='right' 標題顯示位置 center(默認) left
-
fontdict : 字典形式 同標簽
plt.title('circle', loc='right', fontdict={'fontsize':50, 'rotation':60})
# 子圖沒有.title(),需使用.set_title()
圖例
legend()方法
兩種傳參方法:
【推薦使用】在plot函數中增加label參數
在legend方法中傳入字符串列表
-
loc參數
plt.legend(loc=8)
plt.legend(loc=(0,1)) # 相對坐標(畫板坐標)
字符串 | 數值 | 字符串 | 數值 |
---|---|---|---|
best | 0 | center left | 6 |
upper right | 1 | center right | 7 |
upper left | 2 | lower center | 8 |
lower left | 3 | upper center | 9 |
lower right | 4 | center | 10 |
right | 5 |
-
ncol參數
ncol控制圖例中有幾列
plt.legend(loc=8,ncol=3)
保存圖片
figure.savefig(): 需創建figure對象
-
filename含有文件路徑的字符串或Python的文件型對象。圖像格式由文件擴展名推斷得出,例如,.pdf推斷出PDF,.png推斷出PNG (“png”、“pdf”、“svg”、“ps”、“eps”……)
-
dpi圖像分辨率(每英寸點數),默認為100
-
facecolor圖像的背景色,默認為“w”(白色)
-
transparent=True 透明
-
edgecolor: 邊緣顏色
figure = plt.figure(figsize=(10,6))
plt.plot(n1,label='one',ls='-.')
figure.savefig('./art.png', facecolor='g', dpi=200, transparent=True)
設置plot的風格和樣式
點和線的樣式
顏色
參數color或c
顏色值的方式
-
別名
-
color='r'
-
-
合法的HTML顏色名
-
color = 'red'
-
顏色 | 別名 | HTML顏色名 | 顏色 | 別名 | HTML顏色名 |
---|---|---|---|---|---|
藍色 | b | blue | 綠色 | g | green |
紅色 | r | red | 黃色 | y | yellow |
青色 | c | cyan | 黑色 | k | black |
洋紅色 | m | magenta | 白色 | w | white |
-
HTML十六進制字符串
color = '#eeefff'
-
歸一化到[0, 1]的RGB元組
color = (0.3, 0.3, 0.4)
透明度
alpha參數 值為0-1范圍
plt.plot(x,np.sin(x), c='b', alpha=0.1)
背景色
設置坐標軸的背景色(畫布)
# 方式1
axes = plt.subplot(facecolor='g') # 設置畫布背景色
axes.plot(x, np.sin(x))
# 方式2
plt.gca(facecolor='g') # 獲取當前軸面
plt.plot(x, np.sin(x))
設置畫板背景色
plt.figure(facecolor='r')
plt.plot(x, np.sin(x))
線型
參數linestyle或ls
線條風格 | 描述 | 線條風格 | 描述 |
---|---|---|---|
'-' | 實線 | ':' | 虛線 |
'--' | 破折線 | 'steps' | 階梯線 |
'-.' | 點划線 | 'None' / ',' | 什么都不畫 |
線寬
參數linewidth或lw
plt.plot(x, np.sin(x), linewidth=5, c='r')
不同寬度的破折線
dashes參數 設置破折號序列各段的寬度
# dashes的元素個數必須是偶數個 [線寬,空白寬] 交替
plt.plot(x, np.sin(x), linewidth=5, c='r', dashes=[3,5,1,2,6,7])
點型
marker : 點形狀
markersize: 點大小
x = np.linspace(0, 2*np.pi, 10)
plt.plot(x, np.sin(x), c='r', marker='2', markersize=50)
標記 | 描述 | 標記 | 描述 |
---|---|---|---|
'1' | 一角朝下的三腳架 | '3' | 一角朝左的三腳架 |
'2' | 一角朝上的三腳架 | '4' | 一角朝右的三腳架 |
標記 | 描述 | 標記 | 描述 |
---|---|---|---|
's' | 正方形 | 'p' | 五邊形 |
'h' | 六邊形1 | 'H' | 六邊形2 |
'8' | 八邊形 |
標記 | 描述 | 標記 | 描述 |
---|---|---|---|
'.' | 點 | 'x' | X |
'*' | 星號 | '+' | 加號 |
',' | 像素 |
標記 | 描述 | 標記 | 描述 |
---|---|---|---|
'o' | 圓圈 | 'D' | 菱形 |
'd' | 小菱形 | '','None',' ',None | 無 |
多參數連用
顏色、點型、線型
x = np.linspace(0, 2*np.pi, 10)
plt.figure(figsize=(10,8))
plt.plot(x, np.sin(x), 'g-o', markersize=50) # g-o 表示 線顏色,線型,點型 可不寫全
更多點和線的設置
x = np.linspace(0,10, 10)
plt.plot(x,x,c='b', lw=2, ls='-.', marker='o', markersize=10, markeredgecolor='g',markeredgewidth=3,markerfacecolor='r')
參數 | 描述 | 參數 | 描述 |
---|---|---|---|
color或c | 線的顏色 | linestyle或ls | 線型 |
linewidth或lw | 線寬 | marker | 點型 |
markeredgecolor | 點邊緣的顏色 | markeredgewidth | 點邊緣的寬度 |
markerfacecolor | 點內部的顏色 | markersize | 點的大小 |
在一條語句中為多個曲線進行設置
x = np.linspace(0,2*np.pi, 10)
plt.plot(x,np.sin(x),'g:o',x,np.cos(x),'b-.*',markersize=10 )
多個曲線同一設置
# 統一相同設置,使用關鍵參數, 會覆蓋前面單獨設置屬性
x = np.linspace(0,2*np.pi, 10)
plt.plot(x, np.sin(x), 'g:d',x, np.cos(x),color='r') # g:d 失效
三種設置方式
向方法傳入關鍵字參數
plt.plot(x,np.sin(x), c='r')
對實例使用一系列的setter方法
line, = plt.plot(x,np.sin(x))line.set_color('g')
使用setp()方法
line, = plt.plot(x,np.sin(x))plt.setp(line, 'color', 'y') # setp : set property
X、Y軸坐標刻度
xticks()和yticks()方法
plt.plot(x,np.sin(x), c='r')
# ticks 刻度 labels 標簽
plt.xticks([0, np.pi/2, np.pi, 3*np.pi/2, 2*np.pi], ['0', 'np.pi/2', 'np.pi', '3np.pi/2', '2np.pi'])
plt.yticks([-1, 0 ,1], ['-1', '0', '1'])
面向對象方法
axes = plt.subplot() # 創建子圖
使用子圖對象調用:
set_xticks、set_yticks、set_xticklabels、set_yticklabels方法
正弦余弦
LaTex語法,用𝜋π等表達式在圖表上寫上希臘字母
α alpha , Π pi , θ theta , σ sigma , λ lambda
2D圖形
直方圖
【直方圖的參數只有一個x!!!不像條形圖需要傳入x,y】
hist() 參數
-
bins可以是一個bin數量的整數值,也可以是表示bin的一個序列。默認值為10
-
normed如果值為True,直方圖的值將進行歸一化處理,形成概率密度,默認值為False
-
color指定直方圖的顏色。可以是單一顏色值或顏色的序列。如果指定了多個數據集合,顏色序列將會設置為相同的順序。如果未指定,將會使用一個默認的線條顏色
-
orientation設置orientation為horizontal創建水平直方圖。默認值為vertical
條形圖¶
【條形圖有兩個參數x,y!】
bar() 水平顯示、barh() 垂直顯示
plt.bar(np.arange(0,10), x, width=1 ) # 條形圖的x必須寫.
餅圖
【餅圖也只有一個參數x!】
pie()餅圖適合展示各部分占總體的比例,條形圖適合比較各部分的大小
n = [1,2,3]
plt.pie(n) # n 個元素和超過1, 會計算個元素所占綜合總和比例
n = [0.4, 0.2, 0.3, 0.1] # 各部分剛好占滿餅圖
plt.pie(n)
n = [0.4, 0.2, 0.3,] # 普通未占滿餅圖
plt.pie(n)
餅圖陰影、分裂等屬性設置
#labels參數設置每一塊的標簽;labeldistance參數設置標簽距離圓心的距離(比例值)
#autopct參數設置比例值的顯示格式(%1.1f%%);pctdistance參數設置比例值文字距離圓心的距離
#explode參數設置每一塊頂點距圓形的長度(比例值);colors參數設置每一塊的顏色;
#shadow參數為布爾值,設置是否繪制陰影
# autopct: auto percentage 顯示比例 explode: 裂開, 餅尖距圓心距離 labels: 各部分標簽名
# labeldistance: 標簽距圓心距離 pctdistance: 比例距圓心距離,默認0.6 shadow=True 加陰影
# startangle: 起始角度 textprops={'size',20} 字體
plt.pie([0.4, 0.2, 0.3, 0.1],autopct='%.2f%%', explode=[0.1,0.2,0.1,0.3], labels=list('ABCD'),labeldistance=1,colors=['red', 'green', 'magenta', 'cyan'],pctdistance=0.8,shadow=True,startangle=60,textprops={'size':20})
散點圖
【散點圖需要兩個參數x,y,但此時x不是表示x軸的刻度,而是每個點的橫坐標!】
scatter()
x = np.linspace(0, 2* np.pi, 20)
y = np.sin(x)
plt.scatter(x,y, s=100,c='r', marker='d', alpha=0.6, ) # s 點的大小 alpha 透明度
生成隨機大小,隨機顏色,隨機透明 的餅圖
x = np.random.randn(1000)
y = np.random.randn(1000)
plt.figure(figsize=(10,6))
colors = np.random.rand(1000,4) # RGBA 隨機點顏色,透明度
size = np.random.randint(0,100,size=1000) # 隨機點大小
plt.scatter(x,y,marker='d',c=colors, s=size)
顏色表示:
向量 - 對每個標記使用不同的顏色,並以線性方式將 c
中的值映射到當前顏色圖中的顏色。c
的長度必須等於 x
和 y
的長度。
plt.scatter(x,y,marker='d',c=[0,1,2,1,3], s=size) # c 中每個數字代表一個顏色,映射圖中點的顏色, c長度等於x和y長度
圖形內的文字、注釋、箭頭
控制文字屬性的方法:
所有的方法會返回一個matplotlib.text.Text對象
Pyplot函數 | API方法 | 描述 |
---|---|---|
text() | mpl.axes.Axes.text() | 在Axes對象的任意位置添加文字 |
xlabel() | mpl.axes.Axes.set_xlabel() | 為X軸添加標簽 |
ylabel() | mpl.axes.Axes.set_ylabel() | 為Y軸添加標簽 |
title() | mpl.axes.Axes.set_title() | 為Axes對象添加標題 |
legend() | mpl.axes.Axes.legend() | 為Axes對象添加圖例 |
figtext() | mpl.figure.Figure.text() | 在Figure對象的任意位置添加文字 |
suptitle() | mpl.figure.Figure.suptitle() | 為Figure對象添加中心化的標題 |
annnotate() | mpl.axes.Axes.annotate() | 為Axes對象添加注釋(箭頭可選) |
圖形內的文字
text() 和 figtext()
# 顯示文字到坐標軸內
plt.text(0,0,'sin(0)=0')
plt.text(np.pi/2, 1, 'sin($\pi/2$)=1',fontdict=dict(fontsize=20))
# 顯示文字到坐標軸外
plt.figtext(1,0.5, 'y=sin(x)')
注釋
annotate()xy參數設置箭頭指示的位置,xytext參數設置注釋文字的位置arrowprops參數以字典的形式設置箭頭的樣式width參數設置箭頭長方形部分的寬度,headlength參數設置箭頭尖端的長度,headwidth參數設置箭頭尖端底部的寬度,facecolor(color)設置箭頭顏色shrink參數設置箭頭頂點、尾部與指示點、注釋文字的距離(比例值)
# 第一個坐標代表指示點, 第二個代表注釋文字位置
plt.annotate('this is me',(5,10),(8,15),arrowprops=dict(width=10,headwidth=20,headlength=20, color='r',shrink=0.1))
設置圖例
bbox_to_anchor,ncol mode,borderaxespad設置注解 arrowstyle
plt.plot(n1, label='plot')
plt.plot(n2, label='2nd plot')
plt.plot(n3, label='last plot')
plt.legend(loc=(0,1), ncol=3, mode='expand',borderaxespad=0,bbox_to_anchor=[0,1,1,0.08] )
plt.ylim(ymax=43) # 設置y軸上限
plt.annotate('important value', (50,20),(20,40),arrowprops=dict(arrowstyle='->'))
箭頭
樣式arrstyles = ['-', '->', '-[', '<-', '<->', 'fancy', 'simple', 'wedge']
3D圖
曲面圖
from mpl_toolkits.mplot3d.axes3d import Axes3D
x = np.linspace(0,8,100)
y = np.linspace(0,8,100)
X,Y = np.meshgrid(x,y) # 生成網格
Z = np.sin(X) + np.cos(Y) + 3
plt.figure(figsize=(7*2, 6))
axes1 = plt.subplot(1,2,1,projection='3d') # 定義畫三維圖的子圖
axes1.plot_surface(X,Y,Z) # 畫三維圖
axes2 = plt.subplot(1,2,2,projection='3d')
axes2 = axes2.plot_surface(X,Y,Z,cmap='rainbow')
plt.colorbar(axes2,shrink=0.5) # 設置顏色柱, shrink 寬高縮小為0.5倍
玫瑰圖/極坐標條形圖
x = np.arange(0,2*np.pi,np.pi/4) # x 使用弧度
y = 一個 ndarray
plt.subplot(projection='polar', facecolor='g')plt.bar(x,y,width=np.pi/4,color=np.random.rand(8,3))