首先粗略介紹各個方法
- 首先開頭:plt.figure() ---- 表示鋪開一張作圖的白紙,且若僅有一個圖時可以省略,且其作用域影響的是下一個plt.figure出現前的所有plt點出的方法。
- 結尾必用:plt.show() ---- 表示展示圖像。
- 線圖時用:plt.plot() ---- 裝載數據且指定其顏色、形狀、寬度、圖列中對應的標籤。
- 下面介紹的各個方法均介於figure和show之間。
座標軸的取值範圍、顯示標籤、文字刻度
- xlim |ylim ---- 設置取值範圍
- xlabel | ylabel ---- 座標軸的標籤
- xticks | yticks ---- 座標軸的刻度自定義
- 演示代碼
x=np.linspace(-1,1,50)
y1 = 2 * x + 1
y2 = x ** 2
plt.figure(num=3,figsize=(8,5))
plt.plot(x,y2)
plt.plot(x,y1,color="red",linewidth=1.0,linestyle='--')
# 設置座標軸的取值範圍
plt.xlim((-1,2))
plt.ylim((-2,3))
# 設置座標的標籤
plt.xlabel("Iam X")
plt.ylabel("Iam Y")
# 設置座標軸的小標
new_ticks = np.linspace(-1,2,5)
print(new_ticks)
plt.xticks(new_ticks)
# 座標軸的刻度修改爲文字
plt.yticks([-2,-1.8,-1,1.22,3],
['really bad','bad','normal','good','really good'])
# 使用更加好看的字體--數學的斜體的學術的那種!
# 美元符號+ 空格轉義+正則表達式的r
plt.yticks([-2,-1.8,-1,1.22,3],
[r'$really\ bad$',r'$bad$',r'$normal$',r'$good$',r'$really\ good$'])
# 打印數學形式的α 通過轉字符 \alpha
plt.yticks([-2,-1.8,-1,1.22,3],
[r'$really\ bad$',r'$bad\ \alpha$',r'$normal$',r'$good$',r'$really\ good$'])
plt.show()
座標軸的四邊顯示與邊的移動
- plt.gca() ---- 將當前的座標軸作爲對象,在此基礎上調用一系列的方法。
- plt.gca().spines ---- 取出座標軸的某個邊作爲對象,進行顏色、位置移動等方法的調用。
- plt.gca().xaxis.set_ticks_position ---- 指定座標軸四邊中的那個邊作爲Y軸和X軸。
- 代碼演示
x=np.linspace(-1,1,50)
y1 = 2 * x + 1
y2 = x ** 2
plt.figure(num=3,figsize=(8,5))
plt.plot(x,y2)
plt.plot(x,y1,color="red",linewidth=1.0,linestyle='--')
plt.xlim((-1,2))
plt.ylim((-2,3))
plt.xlabel("Iam X")
plt.ylabel("Iam Y")
new_ticks = np.linspace(-1,2,5)
print(new_ticks)
plt.xticks(new_ticks)
plt.yticks([-2,-1.8,-1,1.22,3],
[r'$really\ bad$',r'$bad\ \alpha$',r'$normal$',r'$good$',r'$really\ good$'])
# =============新的內容================
# gca = get current axis 表示 拿出當前的座標軸
ax = plt.gca()
# Spines 指的是figure圖像的四個邊
ax.spines['right'].set_color('none')
ax.spines['top'].set_color('none')
# 指定我們的主座標軸因該由那個邊框來代替
ax.xaxis.set_ticks_position("bottom")
ax.yaxis.set_ticks_position("left")
# 挪動xy軸的位置
# -1 即將x軸綁定在y軸的-1值得位置。 data 其實不太曉得是啥意思!
ax.spines["bottom"].set_position(("data",-1))
ax.spines["left"].set_position(("data",-0.25))
# =============新的內容================---
plt.show()
圖例
- 當圖中涉及到多個線圖時,就要用到圖例辨識彼此。
- plt.plot ---- 指定label,且記得被賦值的變量後必須跟上逗號。
- plt.legend ---- plot中的label需要配合legend才能顯示出圖例。
- 代碼演示
# 在圖像中打標註,標註藍色得線是啥》紅色得線是啥
x=np.linspace(-1,1,50)
y1 = 2 * x + 1
y2 = x ** 2
plt.figure(num=3,figsize=(8,5))
########改動範圍###################################
# 施加線得名字,
l1, = plt.plot(x,y2,label = 'up')
l2, = plt.plot(x,y1,color="red",linewidth=1.0,linestyle='--',label='down')
# 但是隻是單純得加上label,並不會顯示,需要輔助到legend
# 默認的參數
plt.legend()
# 位置選擇best;loc = {upper right so on
# handles 表示圖例的線 是中括號的形式,需要將上面的兩條線的返回值賦給一個變量
# 且返回的對象要加上一個逗號!
# labels 給兩個對象一個不同的名字,在圖例中的顯示名字!
plt.legend(handles=[l1,l2,],labels=["aaaa","bbbb"],loc="best")
# 如果figure中顯示所有的線條,但是我的圖例中只想告訴大家某一條線條是我們關注的。
plt.legend(handles=[l1,],labels=["aaaa"],loc="best")
##########################################
plt.xlim((-1,2))
plt.ylim((-2,3))
plt.xlabel("Iam X")
plt.ylabel("Iam Y")
new_ticks = np.linspace(-1,2,5)
print(new_ticks)
plt.xticks(new_ticks)
plt.yticks([-2,-1.8,-1,1.22,3],
[r'$really\ bad$',r'$bad\ \alpha$',r'$normal$',r'$good$',r'$really\ good$'])
plt.show()
Annotation標註
- 一共兩種方法:plt.text(文本,簡單) 和plt.annotate(箭頭,複雜)。
- 代碼演示
# 添加註解 :兩種方式:annotation 還有 text
x=np.linspace(-4,4,50)
y2 = x * 2 + 1
plt.figure(num=3,figsize=(8,5))
plt.plot(x,y2)
ax = plt.gca()
ax.spines['right'].set_color('none')
ax.spines['top'].set_color('none')
ax.xaxis.set_ticks_position("bottom")
ax.yaxis.set_ticks_position("left")
ax.spines["bottom"].set_position(("data",0))
ax.spines["left"].set_position(("data",0))
##################################################################3333
x0 = 1
y0 = 2 * x0 + 1
# 向figure中添加一個新的線對象,不過僅是一個點
plt.scatter(x0,y0,color = 'b')
# k 表示black -- 表示block style
# 構造一個兩個點間的線對象。
plt.plot([x0,x0],[y0,0],'k--',lw =2.5)
# method 1
# 第一個參數表示標註的內容、xy表示箭頭指向的線上的那個點的座標、xytext表示標註的文本內容的中點位置
# 即在xy座標的x向右加40,向下減40的一個新座標位置。
# textcoords 表示xytext的點的構建性質是:偏移點。
# arrowprops 字典的形式,箭頭的風格+從偏移點到xy點的連接線的風格。
########################
plt.annotate(r'$2X+1=%s$'%y0,xy=(x0,y0),xycoords='data',xytext=(+40,-40),textcoords='offset points',
fontsize=16,arrowprops=dict(arrowstyle='->',connectionstyle='arc3,rad=.2'))
# method 2
# 定義顏色、內容及正則轉義等
# 前兩個參數是文本的中點座標。第三個參數是文本的內容。第四個參數是字體的格式。
########################
plt.text(-4,3,r'$This\ is\ the\ some\ text.\ \mu\ \sigma_i\ \alpha_t$',
fontdict={'size':16,'color':'r'})
#################################################################33
plt.show()
Trick能見度
- 問題是,圖像因爲太多而遮掩了座標軸的刻度。而解決的方法在於爲座標軸設置Zorder,且設置fontsize和bbox。
- label.set_zorder ---- 不僅僅是要指定座標軸的次序,同時需要指定plot的次序。
- label.set_fontsize ---- 設置每個刻度的大小
- label.set_bbox ---- 輸入字典,設置不透明度等屬性。
- 代碼演示:
# 在圖像比較繁雜時,數據量太多時,而引起的“座標軸的內容被擋住”的情況
x=np.linspace(-3,3,50)
y2 = x * 0.1
plt.figure()
#################################################
plt.plot(x,y2,linewidth=10,zorder=1)
#################################################
plt.ylim(-2,2)
ax = plt.gca()
ax.spines['right'].set_color('none')
ax.spines['top'].set_color('none')
ax.xaxis.set_ticks_position("bottom")
ax.yaxis.set_ticks_position("left")
ax.spines["bottom"].set_position(("data",0))
ax.spines["left"].set_position(("data",0))
#################################################
# 把ticks的label、座標軸數值的label能全部拿出來,以單個單個的設置參數,
# set_bbox 也可以用在 plot、scatter等中!!!!!
# 透明度的重點在於 zorder的設置
# plot中設置爲zorder=1,這裏的座標軸的label需要設置zorder =2!!!
for label in ax.get_xticklabels() + ax.get_yticklabels():
label.set_zorder(2)
label.set_fontsize(12)
label.set_bbox(dict(facecolor='white',edgecolor='None',alpha=0.7))
#################################################
plt.show()
Scatter 散點圖
- plt.scatter ---- 散點圖。
- 代碼演示
n = 1024
X = np.random.normal(0,1,n)
Y = np.random.normal(0,1,n)
T = np.arctan2(Y,X) # for color value
plt.scatter(X,Y,s=75,c=T,alpha=0.5)
plt.xlim((-1.5,1.5))
plt.ylim((-1.5,1.5))
# 消除座標軸的刻度
plt.xticks(())
plt.yticks(())
plt.show()
Bar 柱狀圖
- plt.bar ---- 柱狀圖
- plt.text ---- 爲每個柱子添加標籤。
- 代碼演示
X = np.arange(n)
# 製作十二個向上的柱狀圖和十二個向下的柱狀圖
# uniform 均勻分佈
Y1 = (1-X/float(n))* np.random.uniform(0.5,1.0,n)
Y2 = (1-X/float(n))* np.random.uniform(0.5,1.0,n)
###################################################
# 施加主體的顏色和邊緣顏色
plt.bar(X,+Y1,facecolor='#9999ff',edgecolor='white')
plt.bar(X,-Y2,facecolor='#ff9999',edgecolor='white')
# 爲每個柱狀圖施加值
for x,y in zip(X,Y1):
# ha 即 horizontal alignment 橫向對其方式
plt.text(x,y+0.05,'-%.2f'%y,ha='center',va='bottom')
for x,y in zip(X,Y2):
plt.text(x,-y-0.05,'-%.2f'%y,ha='center',va='top')
###################################################
plt.xlim(-.5,n)
plt.xticks(())
plt.ylim(-1.25,1.25)
plt.yticks(())
plt.show()
4. 堆疊柱狀圖的演示
# 繪製柱形圖,且 第二條柱形圖堆疊在第一條柱形圖之上!
x = [1,2,3,4]
y = [5,6,7,8]
y1 = [9,10,34,23]
plt.bar(x,y)
# bottom = y 表示以Y作爲底部!
plt.bar(x,y1,bottom = y)
plt.show()
Co’ntours 等高線圖
- plt.contourf ---- 等高線圖
- 代碼演示
def f(x,y):
# the height function
return (1-x/2 + x**5 + y**3)*np.exp(-x**2-y**2)
n =256
x= np.linspace(-3,3,n)
y= np.linspace(-3,3,n)
X,Y = np.meshgrid(x,y)
# use plt.contourf to filling contours
# X,Y and value for (X,Y) point
# 8 代表等高線圖分10部分 ; 0 則表示兩部分
# cmp表示之前的參數要調用到的函數。
plt.contourf(X,Y,f(X,Y),8,alpha=0.75,cmap=plt.cm.hot)
# use plt.contour to add contour lines
# 畫等高線
C = plt.contour(X,Y,f(X,Y),8,colors='black',linewidths=.5)
# adding lable 即將label畫在等高線上。
# inline 畫在線裏面。
plt.clabel(C,inline=True,fontsize=10)
plt.xticks(())
plt.yticks(())
plt.show()
Image 圖片
- plt.imshow ---- 輸入一個shape序列,指定cmap,用以解析序列。
- plt.colorbar ---- 增加顏色刻度條
- 代碼演示
# image data
a = np.array([0.3,0.36,0.43,0.36,0.43,0.52,0.43,0.52,0.65]).reshape(3,3)
# interpolation
plt.imshow(a,interpolation='nearest',cmap='bone',origin='lower')
# origin 顏色倒敘
#plt.imshow(a,interpolation='nearest',cmap='bone',origin='upper')
# 標註:ColorBar
# 參數:shrink 壓縮百分之90 百分百時 於圖片的高度相等
plt.colorbar(shrink=0.9)
plt.xticks(())
plt.yticks(())
plt.show()
3D 數據
- 引入新的庫 ---- from mpl_toolkits.mplot3d import Axes3D
- ax.plot_surface ---- 3D圖的構造
- ax.contourf ---- 映射面的構造
- 代碼演示
fig = plt.figure()
ax = Axes3D(fig)
# X Y value
X = np.arange(-4,4,0.25)
Y = np.arange(-4,4,0.25)
# mesh 將XY構成一個面 等高線圖
X,Y=np.meshgrid(X,Y)
R = np.sqrt(X**2 + Y**2)
# height value
Z = np.sin(R)
##################################################
# 3D 圖的構造
# stride 表示福度,如果福度爲5 則表示經過5個值後纔開始切換爲下一個顏色!!!
ax.plot_surface(X,Y,Z,rstride=1,cstride=1,cmap=plt.get_cmap('rainbow'))
#等高線圖的構造
# zidr 即表示3D圖映射到的那個軸的切面上。offset要適時改變。
#ax.contourf(X,Y,Z,zdir='z',offset=-2,cmap='rainbow')
ax.contourf(X,Y,Z,zdir='x',offset=-4,cmap='rainbow')
##################################################
ax.set_zlim(-2,2)
plt.show()
SubPlot多合一顯示
- plt.figure() ---- 多圖時必須指定,而後面的subplot均是建立在figure之上繪製的。
- plt.subplot ---- 經常配合其他的plt.plot。
- 代碼演示
plt.figure()
# 表示將這個Figure分成兩行兩列,然後佔用第一個位置,來plot東西
plt.subplot(2,2,1)
plt.plot([0,1],[0,1])
plt.subplot(2,2,2)
plt.plot([0,1],[0,1])
plt.subplot(2,2,3)
plt.plot([0,1],[0,1])
plt.subplot(2,2,4)
plt.plot([0,1],[0,1])
plt.show()
plt.figure()
# 211 會有些模糊
plt.subplot(2,1,1)
plt.plot([0,1],[0,1])
plt.subplot(2,3,4)
plt.plot([0,1],[0,1])
plt.subplot(2,3,5)
plt.plot([0,1],[0,1])
plt.subplot(2,3,6)
plt.plot([0,1],[0,1])
plt.show()
Subplot 分格顯示
- 多圖展示的另外兩種方法subplot2grid 和 gridspec 和 面向對象的方法
- plt.subplot2grid的代碼演示
# method1:subplot2grid
########################################################3
plt.figure()
# 起始點時0,0 佔用一行三列
# 第一個參數:整個figure的shape如何
# 第二個參數:從哪一行哪一列開始,且佔用幾列,佔用幾行。
ax1 = plt.subplot2grid((3,3),(0,0),colspan=3,rowspan=1)
ax1.plot([1,2],[1,2])
# 不同於座標軸的標籤設置,這是圖像的題目。
ax1.set_title('ax1_title')
ax2 = plt.subplot2grid((3,3),(1,0),colspan=2,rowspan=1)
ax2.plot([1,2],[1,2])
ax2.set_title('ax2_title')
ax3 = plt.subplot2grid((3,3),(1,2),colspan=2,rowspan=1)
ax3.plot([1,2],[1,2])
ax3.set_title('ax3_title')
ax4 = plt.subplot2grid((3,3),(2,0))
ax4.plot([1,2],[1,2])
ax4.set_title('ax4_title')
ax5 = plt.subplot2grid((3,3),(2,1),colspan=2,rowspan=1)
ax5.plot([1,2],[1,2])
ax5.set_title('ax5_title')
########################################################3
plt.tight_layout()
plt.show()
3. gridspec 代碼演示
# method 2:gridspec
########################################################3
import matplotlib.gridspec as gridspec
plt.figure()
gs = gridspec.GridSpec(3,3)
ax6 = plt.subplot(gs[0,:])
ax7 = plt.subplot(gs[1,:2])
ax8 = plt.subplot(gs[1,2])
ax9 = plt.subplot(gs[-1,0])
ax10 = plt.subplot(gs[-1,-2])
########################################################3
plt.tight_layout()
plt.show()
- 面向對象方法 代碼演示
# method 3 : easy to define structure
########################################################3
# 之前都是subplot
# 這種的特點時:能夠做到共享座標軸!!!
fig,((ax11,ax12),(zx21,zx22)) = plt.subplots(2,2,sharex=True,sharey = True)
ax11.scatter([1,2],[1,2] )
########################################################3
plt.tight_layout()
plt.show()
圖中圖
1.ax1 = fig.add_axes ---- 增加畫布
2. 代碼演示
# 在一張大圖裏面,如何放上一張小圖
import matplotlib.gridspec as gridspec
fig = plt.figure()
x= [1,2,3,4,5,6,7]
y = [1,3,4,2,5,8,6]
# 相對於整個figure來說,距離figure的左下角位置的原點,靠近左邊百分之十...整個圖像的高度,寬度如何
left, bottom, width, height = 0.1,0.1,0.8,0.8
ax1 = fig.add_axes([left, bottom, width, height])
ax1.plot(x,y,'r')
ax1.set_xlabel('x')
ax1.set_ylabel('y')
ax1.set_title('title')
left, bottom, width, height = 0.2,0.6,0.25,0.25
ax2 = fig.add_axes([left, bottom, width, height])
ax2.plot(x,y,'b')
ax2.set_xlabel('x')
ax2.set_ylabel('y')
ax2.set_title('insight_one')
plt.axes([0.6,0.2,0.25,0.25])
plt.plot(y[::-1],x,'g')
plt.xlabel('x')
plt.ylabel('y')
plt.title('insight_two')
次座標圖
- ax1.twinx ---- 通過鏡面的效果,把Y軸對稱過來。
- 代碼演示
# 兩個y軸,共用一個X軸
x = np.arange(0,10,0.1)
y1 = 0.05 * x ** 2
y2 = -1*y1
fig,ax1 = plt.subplots()
# 通過鏡面的效果,把Y軸對稱過來。
ax2 = ax1.twinx()
ax1.plot(x,y1,'g-')
ax2.plot(x,y2,'b--')
ax1.set_xlabel('X data')
ax1.set_ylabel('Y1',color='g')
ax2.set_ylabel('Y2',color='b')
plt.show()