Matplotlib學習總結梳理【Matplotlib學習記錄】

首先粗略介紹各個方法

  1. 首先開頭:plt.figure() ---- 表示鋪開一張作圖的白紙,且若僅有一個圖時可以省略,且其作用域影響的是下一個plt.figure出現前的所有plt點出的方法。
  2. 結尾必用:plt.show() ---- 表示展示圖像。
  3. 線圖時用:plt.plot() ---- 裝載數據且指定其顏色、形狀、寬度、圖列中對應的標籤。
  4. 下面介紹的各個方法均介於figure和show之間。

座標軸的取值範圍、顯示標籤、文字刻度

  1. xlim |ylim ---- 設置取值範圍
  2. xlabel | ylabel ---- 座標軸的標籤
  3. xticks | yticks ---- 座標軸的刻度自定義
  4. 演示代碼
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()

在這裏插入圖片描述

座標軸的四邊顯示與邊的移動

  1. plt.gca() ---- 將當前的座標軸作爲對象,在此基礎上調用一系列的方法。
  2. plt.gca().spines ---- 取出座標軸的某個邊作爲對象,進行顏色、位置移動等方法的調用。
  3. plt.gca().xaxis.set_ticks_position ---- 指定座標軸四邊中的那個邊作爲Y軸和X軸。
  4. 代碼演示
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()

在這裏插入圖片描述

圖例

  1. 當圖中涉及到多個線圖時,就要用到圖例辨識彼此。
  2. plt.plot ---- 指定label,且記得被賦值的變量後必須跟上逗號。
  3. plt.legend ---- plot中的label需要配合legend才能顯示出圖例。
  4. 代碼演示
# 在圖像中打標註,標註藍色得線是啥》紅色得線是啥
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標註

  1. 一共兩種方法:plt.text(文本,簡單) 和plt.annotate(箭頭,複雜)。
  2. 代碼演示
# 添加註解  :兩種方式: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能見度

  1. 問題是,圖像因爲太多而遮掩了座標軸的刻度。而解決的方法在於爲座標軸設置Zorder,且設置fontsize和bbox。
  2. label.set_zorder ---- 不僅僅是要指定座標軸的次序,同時需要指定plot的次序。
  3. label.set_fontsize ---- 設置每個刻度的大小
  4. label.set_bbox ---- 輸入字典,設置不透明度等屬性。
  5. 代碼演示:
# 在圖像比較繁雜時,數據量太多時,而引起的“座標軸的內容被擋住”的情況
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 散點圖

  1. plt.scatter ---- 散點圖。
  2. 代碼演示
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 柱狀圖

  1. plt.bar ---- 柱狀圖
  2. plt.text ---- 爲每個柱子添加標籤。
  3. 代碼演示
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 等高線圖

  1. plt.contourf ---- 等高線圖
  2. 代碼演示
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 圖片

  1. plt.imshow ---- 輸入一個shape序列,指定cmap,用以解析序列。
  2. plt.colorbar ---- 增加顏色刻度條
  3. 代碼演示
# 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 數據

  1. 引入新的庫 ---- from mpl_toolkits.mplot3d import Axes3D
  2. ax.plot_surface ---- 3D圖的構造
  3. ax.contourf ---- 映射面的構造
  4. 代碼演示
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多合一顯示

  1. plt.figure() ---- 多圖時必須指定,而後面的subplot均是建立在figure之上繪製的。
  2. plt.subplot ---- 經常配合其他的plt.plot。
  3. 代碼演示
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 分格顯示

  1. 多圖展示的另外兩種方法subplot2grid 和 gridspec 和 面向對象的方法
  2. 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()

在這裏插入圖片描述

  1. 面向對象方法 代碼演示
# 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')

在這裏插入圖片描述

次座標圖

  1. ax1.twinx ---- 通過鏡面的效果,把Y軸對稱過來。
  2. 代碼演示
# 兩個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()

在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章