Python绘制XPS分峰后的填充效果
具怀逸兴
2020年11月27日 11:41

之前的XPS分峰之后用origin的积分功能来进行填充,不过我的origin2015似乎没有这个功能,装了origin2018才可以进行填充。简单步骤就是选中一条线(此时线是independent的),在origin的快捷分析里有“积分”功能,点击后,会弹出一个对话框 (Fig. 1),在“积分”栏里勾选“关闭快捷分析工具后保持阴影颜色”。然后点击“基线” 功能(Fig. 2),模式为“使用现有数据集”,选择你的基线那一列数据。之后就是拉伸积分区域,确保所有区域都被覆盖到。此时关闭对话框,双击目前的灰色区域,在弹出的对话框中修改积分区域的颜色(默认灰色)。

Fig. 1. 确保关闭后积分区域有颜色

Fig. 2. 选择基线


此方法虽然有效,然而对于很多origin版本不够的同学没那么友好,而且有些同学用的是非Windows系统,比如Linux系统,更是对画图带来诸多不便。因此,琢磨了一下用python的matplotlib来画这种图形。此方法应该不是最简便的方法,较为简单粗暴,hhhh。

代码如下:


# -*- coding: utf-8 -*-

"&#​34;"

Created on Thu Nov 26 21:53:15 2020

@author: fan

"&#​34;"

import numpy as np

import pandas as pd

import matplotlib.pyplot as plt

df0 = pd.read_csv('F:/xpstest.csv&#​39;,header=None) #数据存在csv中,读取该csv文件

print(df0.head())

df_name = locals()

for i in range(1,11):                                  #本例有10组数据,实际情况根据需要进行修改。for语句最后有冒号 :

    df_name['df&#​39;+str(i)] = pd.read_csv('F:/xpstest.csv&#​39;,header=None,usecols=[i-1]) #csv默认第一列为column 0,df1需要对应column 0,因此usecols=[i-1]. 注意for循环后一句需要有缩进

    print (df_name['df&#​39;+str(i)].head())  #验证一下是否创建好10个dataframe,可以mute.此行缩进,表示同样处于for循环

X0=np.array(df_name['df1&#​39;])  #dataframe转为一列array,下同

Y01=np.array(df_name['df2&#​39;])

Y02=np.array(df_name['df3&#​39;])

Y03=np.array(df_name['df4&#​39;])

Y04=np.array(df_name['df5&#​39;])

Y05=np.array(df_name['df6&#​39;])

Y06=np.array(df_name['df7&#​39;])

Y07=np.array(df_name['df8&#​39;])

Y08=np.array(df_name['df9&#​39;])

Y09=np.array(df_name['df10&#​39;])

X = X0[:,0]  #转置,下同

Y1 = Y01[:,0]

Y2 = Y02[:,0]

Y3 = Y03[:,0]

Y4 = Y04[:,0]

Y5 = Y05[:,0]

Y6 = Y06[:,0]

Y7 = Y07[:,0]

Y8 = Y08[:,0]

Y9 = Y09[:,0]

fig, ax = plt.subplots()

ax.invert_xaxis()

plt.xlim(808, 775) #set X range

ax.plot(X, Y1, X, Y8, X, Y9, color='dimgray&#​39;,linewidth=0.5) #本例,Y1是原始xps值,Y8为基线,Y9为envelope,这些要画成line。实际运用要分清哪个Y值对应的是原始,基线和envelope

ax.plot(X, Y2, X, Y3, X, Y4, X, Y5, X, Y6, X, Y7, color='none&#​39;,linewidth=0.5) #这些曲线下都要填充颜色,如果有线条会显得不够好看,所以单独画

ax.fill_between(X, Y2, Y8, facecolor='#​9ad3bc',alpha=0.6) #填充颜色在Y2和Y8(基线)之间,下同。alpha为透明度,1为不透明,可根据需要调整

ax.fill_between(X, Y3, Y8, facecolor='red&#​39;)

ax.fill_between(X, Y4, Y8, facecolor='lightcoral&#​39;,alpha=0.6)

ax.fill_between(X, Y5, Y8, facecolor='cornflowerblue&#​39;,alpha=0.6)

ax.fill_between(X, Y6, Y8, facecolor='#​ffdd93',alpha=0.8)

ax.fill_between(X, Y7, Y8, facecolor='#​ffa36c',alpha=0.6)

plt.xlabel('Binding energy (eV)&#​39;, fontdict={'family&#​39; : 'Arial&#​39;, 'size&#​39;   : 16}) #X label 字体设置

plt.ylabel('Counts (s)&#​39;, fontdict={'family&#​39; : 'Arial&#​39;, 'size&#​39;   : 16})  #Y label 字体设置

plt.xticks(fontproperties = 'Arial&#​39;, size = 12) #X轴 字体设置

plt.yticks(fontproperties = 'Arial&#​39;, size = 12) #Y轴 字体设置

plt.show()

fig.savefig('XPS-Co1.tif&#​39;,dpi=600,format='tif&#​39;) #保存图片,如需要矢量图可改为eps

fig.savefig('XPS-Co1.png&#​39;,dpi=600,format='png&#​39;) #保存图片,如需要矢量图可改为eps

print('done!&#​39;)

画图结果(局部)

原始值,基线,envelope有line color,填充区域只填充了颜色,去掉了line color

横坐标效果