本文的目的在于使用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放在图像外侧时,如果不设置图像大小等参数,保存的图往往是不完整的。这部分等遇到了再补充。
最终绘制的图。