本人研究生二年级学生,之前科研绘图用的软件主要有Origin、Photoshop、Sketchup等。其中origin用的最多,它可以方便的导入实验数据,然后根据需要,画出需要的图,例如柱状图,散点图等。而且,origin很好对图片进行修改,例如你要将x轴加粗,直接双击要修改的x轴,在其中找到可以修改x轴粗细的地方,将粗细调粗一点。非常人性化。这么好用的软件,你可能会问,为什么你还要用python画图?
因为origin电脑自带的配色太难看了,当然这个可以自己后期修改。另一个原因是很多图origin画不了。python虽然需要自己编辑代码,但是这说明这软件定制性很强,在加上可以通过Photoshop对导出的图片进行后期处理。
下面我们就开始学习如何用python画图吧。
首先我们要用到常用的绘图函数库matplotlib其中的pyplot
因此首先要导入这个库(没有的话需要安装)
import matplotlib.pyplot as plt
下面的步骤就是如何导入到python中,如果数据较少,可以直接在python中输入,如果较多,就要从Excel或者txt中导入,我通常选择从Excel中导入,因为在Excel中可以很好的处理数据(例如复制粘贴,取相反数等)。因为暂时只考虑读取Excel,因此只需要用到xlrd这个函数库
import xlrd
下面就要导入数据了,我这次要画的图为电化学阻抗图(EIS图),需要实轴和虚轴的数据。我做了三种不同材料的阻抗图,将每个材料对应的阻抗数据放在一个Excel不同sheet中。每个sheet的第一行(表头)如下:
从上面图片可以看出,我们需要的数据在第二列和第三列。好了,我们可以开始写代码了。
#导入数据
workbook = xlrd.open_workbook(r"C:\Users\10178\Desktop\EIS.xlsx")
#GCE,HA,MWCNTs_HA分别在sheet1,sheet2,sheet3,
GCE = workbook.sheet_by_index(0) #根据sheet编号获取gce阻抗数据
HA = workbook.sheet_by_index(1) #根据sheet编号获取HA阻抗数据
MWCNTs_HA = workbook.sheet_by_index(2) #根据sheet编号获取MWCNTs/HA阻抗数据
通过以上代码,我们有了GCE 、HA、MWCNTs_HA的所有数据了。由于之前说过我们需要画图的数据在第二列和第三列,所以我们要根据列数来读取数据,记住要去第一行的数据
GCE_real = GCE.col_values(1)[1:] #获取GCE的EIS实轴值
GCE_img = GCE.col_values(2)[1:] #获取GCE的EIS虚轴值
HA_real = HA.col_values(1)[1:] #获取HA的EIS实轴值
HA_img = HA.col_values(2)[1:] #获取HA的EIS虚轴值
MWCNTs_HA_real = MWCNTs_HA.col_values(1)[1:] #获取MWCNTs_HA的EIS实轴值
MWCNTs_HA_img = MWCNTs_HA.col_values(2)[1:] #获取MWCNTs_HA的EIS虚轴值
好了,得到这些数字后,我们可以画图了(具体的画图过中用到的函数在之后的文章中会详说),首先画图要有一张图(Figure),这里利用面向对象的方法,然后直接可以开始画散点图(scatter)
fig,ax = plt.subplots()
ax.scatter(GCE_real,GCE_img,label="GCE",s=80,marker="*")
ax.scatter(HA_real,HA_img,label="a-HA/GCE",s=40,marker="s")
ax.scatter(MWCNTs_HA_real,MWCNTs_HA_img,s=40,label="MWCNTs/a-HA/GCE")
其中s代表散点图大小,marker为散点形状,label为标签,内容为后面的legend所用。
这时候,基本上图片就成型了,但是我们需要对图片进行修饰,例如坐标轴加上标签,坐标轴数字加粗等等。
label_font = {'family': 'Times New Roman', 'weight': 'bold', 'size': 15}
ticklabel_font = {'family': 'Times New Roman', 'weight': 'bold', 'size': 12}
#设置x,y轴标签
ax.set_xlabel("Z'/ohm",fontdict=label_font)
ax.set_ylabel("-Z''/ohm",fontdict=label_font)
#设置坐标轴粗细
ax.spines['bottom'].set_linewidth(3)
ax.spines['left'].set_linewidth(3)
ax.spines['right'].set_linewidth(3)
ax.spines['top'].set_linewidth(3)
#设置坐标轴标签
x_labels = [0,500,1000,1500,2000]
ax.set_xticks(x_labels)
ax.set_xticklabels(x_labels,fontdict=ticklabel_font)
y_labels = [0,300,600,900,1200]
ax.set_yticks(y_labels)
ax.set_yticklabels(y_labels,fontdict=ticklabel_font)
#加入图例
plt.legend(prop=ticklabel_font,shadow=True)
所有python写的程序,加上这句后,会显示出图片
plt.show()
这样我们的EIS图就画完了,效果如下