Python 繪圖與可視化 matplotlib(上)


參考鏈接:https://www.cnblogs.com/dudududu/p/9149762.html

更詳細的:https://www.cnblogs.com/zhizhan/p/5615947.html

Matplotlib是一個2D繪圖庫,在繪圖及顯示效果方面更加出色,它和大名鼎鼎的matlab並不是一個軟件,可以認為前者是后者遷移到Python上的圖形庫

使用:

  安裝matplotlib

pip install matplotlib

  我們先從簡到繁,先繪制一組正弦和余弦圖像,然后再逐步美化它

import matplotlib.pyplot as plt#約定俗成的寫法
import numpy as np

def draw():
   #endpoint=True的作用還不清楚 X=np.linspace(-np.pi,np.pi,256,endpoint=True)#linspace是Matlab中的一個指令,用於產生指定范圍內(-np.pi[-π] to np.pi[π])的指定數量點數(256),相鄰數據跨度相同,並返回一個行向量。 C,S=np.cos(X),np.sin(X)#C,S分別對應上述256個值對應的正弦函數值和余弦函數值組成的numpy數組 plt.plot(X,C)#畫線的函數傳入的numpy數組 plt.plot(X,S) plt.show() draw()

  使用matplotlib的默認配置,可以滿足我們的大部分要求,比如運行上面的代碼,我們就可以得到漂亮的圖像

  上面的線條顏色(不同的線條顏色),線條寬度都是matplotlib的默認配置定義的。不過我們任然可以自定義大多數的默認配置,比如顏色、粗細、風格、圖片大小和分辨率、風格、坐標軸、坐標軸以及網格的屬性、文字以及文字屬性等

默認配置

import matplotlib.pyplot as plt
import numpy as np

#創建一個8*6點的圖(應該是畫布的意思),分辨率為80,不知道這個8*6點是什么意思,是圖像長寬矩形畫布的比例嗎,可能是,截圖的尺寸差不多
plt.figure(figsize=(8,6),dpi=80)#記得加plt#*********************************看這個######若是需要對這個畫板進行操作,比如添加動畫什么的,就需要把這個創建的figure對象保存起來fig=plt.figure(8,6)
#創建一個新的1*1的子圖,接下來的圖繪制在第一塊(也是唯一的一塊)
plt.subplot(1,1,1)#*********************************看這個#這個也返回一個對象ax=fig.subplot(111)#若是上面的保存了
X=np.linspace(-np.pi,np.pi,256,endpoint=True) C,S=np.cos(X),np.sin(X) #繪制余弦圖像,使用的線條屬性為:紅色、寬度為1,線條為點 plt.plot(X,C,color="red",linewidth=1.0,linestyle=':')#*********************************看這個代替plt.plot(X,C)
# linestyle的種類有'-', '--', '-.', ':', 'None', ' ', '', 'solid', 'dashed', 'dashdot', 'dotted' plt.plot(X,S,color="gray",linewidth=1.0,linestyle='-') #設置X軸的上下限(注意兩個不同) plt.xlim(-4.0,4)#*********************************看這個
#設置X軸上的坐標,可以指定顯示-4到4這個區域的,9代表將區域等分為9個點 plt.xticks(np.linspace(-4,4,9,endpoint=True))#*********************************看這個
plt.ylim(-1.0,1.0) plt.yticks(np.linspace(-1,1,5,endpoint=True)) #以指定的80分辨率保存圖片,保存的位置在這個.py程序同目錄下 plt.savefig('example_1.png',dpi=80)#*********************************看這個
#supported formats: eps, pdf, pgf, png, ps, raw, rgba, svg, svgz plt.show()

  2)可以改變figure中的值來水平或垂直方向上拉伸圖片

plt.fingure(figsize=(8,6),dpi=80)
plt.fingure(figsize=(10,6),dpi=80)#與上面繪制的圖像相比,將會水平拉伸整個圖片

  3)調整畫布和內容的邊界(留出一些間隔)

  可以獲取到畫布或子畫布的最大最小值(是坐標軸上下限的數值),從而來調整邊緣的空白,但我感到很奇怪,因為調整的基准是通過獲取全契合時(即圖像到了畫布的邊緣)畫布的尺寸乘以某個倍數,這個尺寸是通過設置坐標軸的上下限來實現的,而改變也是通過設置畫布的坐標軸的上下限來設置的,這不是進入了 死循環嗎。不是的,因為獲取的基准是通過np.linspace()返回的點設置的(那么新的問題,對於這個正弦余弦函數,y軸有范圍,可是X軸左右不是無窮小和無窮大的嗎,猜想是:在繪制時並不是真正的無窮大,因為無窮大的時候就沒法繪制了,應該是matplotlib里面繪制有一個類似截取的機制。),設置坐標的上下限只是在程序完成的時候在裁剪一下了

  代碼如下

plt.plot(X,S,color="gray",linewidth=1.0,linestyle='-')

xmin,xmax=X.min(),X.max()
ymin,ymax=C.min(),C.max()
dx=(xmax-xmin)*0.2
dy=(ymax-ymin)*0.2

#設置X軸的上下限(注意兩個不同)
# plt.xlim(-4.0,4)
plt.xlim(xmin-dx,xmin+dx)

  4)設置坐標軸上的標記

# plt.xticks(np.linspace(-4,4,9,endpoint=True))
plt.xticks([-np.pi,-np.pi/2,0,np.pi/2,np.pi])#是為了找到某個坐標點而已了

  圖片:

5)設置坐標的標簽

  我們可以將3.142當成π,但是畢竟不太精確,當我們使用plt.xticks()設置坐標軸的坐標時,還可以同時設置坐標的“標簽”,注意這里使用了lateX(百度LateX是一個排版軟件,但下面語句唯一有些奇怪的就是一些類似特殊字符的代碼,不知道他們和lateX有什么關系)

plt.xticks([-np.pi,-np.pi/2,0,np.pi/2,np.pi],[r'$-\pi$',r'$-\pi/2$',r'$0$',r'$+\pi/2$',r'$+\pi$'])

  效果:

 

 6)移動“脊柱”

  不知道為什么把這個稱作為脊柱(spine),反正坐標軸線和上面的標記(坐標)一塊被稱為“脊柱”,脊柱記錄了數據區域的范圍,他可以放在任何位置,不過至今為止(指本片文章到現在為止,並不是約定成俗的習慣),我們通常將他們放在圖像的四邊(上面圖可以看出來,是兩條有坐標的(左邊和下邊的)以及另外沒有坐標的(上面和右邊的))

  實際上每幅圖像有四條脊柱,為了將脊柱放在圖像的正中央,我們就必須隱藏其中的兩條(右邊和上邊的),將他們兩個調整為無色,然后調整剩下的兩條到合適的位置,數據空間的零點

#將脊柱(坐標軸)調整到數據空間中的零點
plt.ax=plt.gca()
plt.ax.spines['right'].set_color('none')
plt.ax.spines['top'].set_color('none')
plt.ax.xaxis.set_ticks_position('bottom')#是設置坐標的位置在坐標軸下邊
plt.ax.spines['bottom'].set_position(('data',0))
plt.ax.yaxis.set_ticks_position('left')
plt.ax.spines['left'].set_position(('data',0))

  效果:

7)添加圖例

  不要忘記plt.legend(loc='upper left')

  圖例是對圖像進行說明的,比如cos函數的圖像是什么亞子的,要添加圖例,我們只需要在plot()函數里以【鍵-值】的形式添加一個參數

plt.plot(X,C,color="red",linewidth=2.0,linestyle=':',label='cosine')#label中顯示不出中文

plt.legend(loc='upper left')#還有這個#legend:圖例

# linestyle的種類有'-', '--', '-.', ':', 'None', ' ', '', 'solid', 'dashed', 'dashdot', 'dotted'
plt.plot(X,S,color="gray",linewidth=1.0,linestyle='-')

  效果:

 

8)給一些特殊點做注釋

  假如我們希望在2/3π的位置給兩條函數曲線上加一個注釋,首先我們在對應的函數圖像上的位置畫一個點,然后向X軸引一條垂線,以虛線標記,最后寫上注釋的內容

---snip----
plt.ax.spines['left'].set_position(('data',0))

#給一些特殊點做注釋 
t=2*np.pi/3
plt.plot([t,t],[0,np.cos(t)],color='blue',linewidth=2.5,linestyle='--')
plt.scatter([t,],[np.cos(t),],50,color='blue')#scatter:分散
plt.annotate(r'$\sin(\frac{2\pi}{3})=\frac{\sqrt{3}}{2}$',#annotate:注釋;別看長,寫一遍就明白了
    xy=(t,np.sin(t)),xycoords='data',#xy的位置
    xytext=(+0,+0),textcoords='offset points',fontsize=16,#xytext:設置注釋的位置相對偏移(類似坐標)
    arrowprops=dict(arrowstyle='->',connectionstyle='arc3,rad=.2')#arrow:箭頭
    )
plt.plot([t,t],[0,np.sin(t)],color='red',linewidth=2.5,linestyle="--")
plt.scatter([t,],[np.sin(t),],50,color='red')
plt.annotate(r'$\cos(\frac{2\pi}{3})=-\frac{1}{2}$',
    xy=(t,np.cos(t)),xycoords='data',
    xytext=(-90,-50),textcoords="offset points",fontsize=16,
    arrowprops=dict(arrowstyle="->",connectionstyle='arc3,rad=.2')
    )
plt.show()

  效果:

 

9)設置坐標軸上的坐標樣式(未生效)

  上圖中的坐標被擋住了,為了讓他們看起來更明顯,可是放大他們、然后設置半透明的底色,這樣,曲線和坐標都可見了

for label in ax.get_xticklabels() + ax.get_yticklabels():
    label.set_fontsize(16)
    label.set_bbox(dict(facecolor='white', edgecolor='None', alpha=0.65 ))

  下一篇學習圖像、子圖、坐標軸、記號

 10)設置標題:

  更多信息:https://blog.csdn.net/helunqu2017/article/details/78659490

plt.title('Interesting Graph',fontsize='large',fontweight='bold') 設置字體大小與格式
plt.title('Interesting Graph',color='blue') 設置字體顏色
plt.title('Interesting Graph',loc ='left') 設置字體位置
plt.title('Interesting Graph',verticalalignment='bottom') 設置垂直對齊方式
plt.title('Interesting Graph',rotation=45) 設置字體旋轉角度
plt.title('Interesting',bbox=dict(facecolor='g', edgecolor='blue', alpha=0.65 )) 標題邊框

  面向對象api例子:

import matplotlib.pyplot as plt
x=[1,2,3,4,5]
y=[3,6,7,9,2]
 
fig,ax=plt.subplots(1,1)
ax.plot(x,y,label='trend')
ax.set_title('title test',fontsize=12,color='r')
plt.show()

  

 

 

 
       


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM