本文的目的在于使用Matplotlib繪圖,自己的學習過程記錄下來。
需要的軟體是Python。三個Python子產品,分别是Matplotlib、Pandas和Numpy。
一個圖檔包含的部分如圖所示:圖的标題(Title)、橫縱坐标軸(label、axis、major tick、minor tick)、圖例(legend)、網格(grid)、圖(折線圖、散點圖等等)。
建立一個.py檔案,開始圖檔的繪制(這裡的代碼給的是2*2的圖檔繪制)。
在頭部引入Python的子產品。
import numpy as np #引入numpy
import pandas as pd #引入pandas
import matplotlib.pyplot as plt #引入matplotlib繪圖子產品
from matplotlib.pyplot import MultipleLocator #這部分是用來設定圖中坐标軸的間隔
利用Pandas讀取資料。 可以利用pd.read_csv()、pd.read_excel()分别讀取txt、xlsx格式的資料。這裡使用excel存儲資料。
部分資料
#讀取整張表
df = pd.read_excel('./sj.xlsx', 'Sheet1',index_col=None,na_values=['NA'])
#利用pandas提供的通過位置(df.iloc[])選取資料來定位資料
#iloc[,]中分号前的代表行(row)、分号後的代表列(column)。冒号(:)代表引用行或列的所有資料。
#df.iloc[0:1,0:1]表示選取前兩行、前兩列的資料。
x1 = df.iloc[:,0]
y1 = df.iloc[:,1]
x2 = df.iloc[:,2]
y2 = df.iloc[:,3]
x3 = df.iloc[:,4]
y3 = df.iloc[:,5]
繪制圖檔前首先要
建立空白的圖檔。
fig = plt.figure(figsize=(10,10)) #這裡的圖檔尺寸是1000*1000像素,是以不要設定的過大
ax1 = fig.add_subplot(2,2,1, adjustable='box', aspect=0.6) #建立第一個子圖,adjustable和aspect用來控制子圖的縱橫比例
ax2 = fig.add_subplot(2,2,2, adjustable='box', aspect=0.6)
ax3 = fig.add_subplot(2,2,3, adjustable='box', aspect=0.6)
ax4 = fig.add_subplot(2,2,4, adjustable='box', aspect=0.6)
plt.tight_layout(pad=0.4, w_pad=1.5, h_pad=1.0) #這部分用來控制四個子圖之間的縱橫間距,去除多餘的空白部分。
繪圖(這部分待補充)。
ax1.plot(x1, y1, label='linear')
ax1.plot(x2, y2, label='linear')
ax1.plot(x3, y3, label='linear')
ax2.plot(x1, y1, label='linear')
ax2.plot(x2, y2, label='linear')
ax2.plot(x3, y3, label='linear')
ax3.plot(x1, y1, label='linear')
ax3.plot(x2, y2, label='linear')
ax3.plot(x3, y3, label='linear')
ax4.plot(x1, y1, label='linear')
ax4.plot(x2, y2, label='linear')
ax4.plot(x3, y3, label='linear')
坐标軸設定。 #坐标軸标題設定
ax1.set_xlabel('FRP tendon stress increment/MPa')
ax1.set_ylabel('Load/kN')
ax2.set_xlabel('FRP tendon stress increment/MPa')
ax2.set_ylabel('Load/kN')
ax3.set_xlabel('FRP tendon stress increment/MPa')
ax3.set_ylabel('Load/kN')
ax4.set_xlabel('FRP tendon stress increment/MPa')
ax4.set_ylabel('Load/kN')
#坐标軸間隔設定
x_major_locator=MultipleLocator(50)
y_major_locator=MultipleLocator(50)
ax1.xaxis.set_major_locator(x_major_locator)
ax1.yaxis.set_major_locator(y_major_locator)
ax2.xaxis.set_major_locator(x_major_locator)
ax2.yaxis.set_major_locator(y_major_locator)
ax3.xaxis.set_major_locator(x_major_locator)
ax3.yaxis.set_major_locator(y_major_locator)
ax4.xaxis.set_major_locator(x_major_locator)
ax4.yaxis.set_major_locator(y_major_locator)
ax1.set_xlim(0,200)
ax1.set_ylim(0,300)
ax2.set_xlim(0,200)
ax2.set_ylim(0,300)
ax3.set_xlim(0,200)
ax3.set_ylim(0,300)
ax4.set_xlim(0,200)
ax4.set_ylim(0,300)
繪制完成之後顯示圖檔或者儲存圖檔。
plt.show()
#fig.savefig('./test.eps',dpi=600,format='eps') #format可以不設定。
fig.savefig('./test.png',dpi=600,bbox_inches='tight') #bbox_inches 去除儲存圖檔時四周多餘的空白。
儲存的圖檔盡量儲存矢量格式的,友善後期修改、P圖。支援的格式有.eps, .jpeg, .jpg, .pdf, .pgf, .png, .ps, .raw, .rgba, .svg, .svgz, .tif, .tiff。一般折線圖的dpi設定為600,而圖像的dpi設定為300。
圖例legend放在圖像外側時,如果不設定圖像大小等參數,儲存的圖往往是不完整的。這部分等遇到了再補充。
最終繪制的圖。