Python绘制论文数据图
前言
论文中经常会借鉴别的图,但复制别人论文的图,有侵权的嫌疑。为此需要重新更改图片。利用python进行绘制高质量的平滑曲线图。python里面绘制折线图,曲线图的模块是matplotlib
一、pandas是什么?
找到自己的想要的论文中的图片,导入到GetData软件,注意导入图片的格式,格式不对的用画图3D等电脑基础软件导。
不会的直接上知乎:数据提取神器GetData使用教程 - 蚂蚁学术的文章 - 知乎
https://zhuanlan.zhihu.com/p/378045402
废话不多说,直接上代码。这段代码里面包含了,读取excel表格,列表转化成数组,插值(目的绘制平滑曲线),画散点,在表上注释文本,替换标签,坐标轴命名,保存pdf操作
"""
著作图7
2022年2月18日
yongqing
"""
import matplotlib.pyplot as plt
import numpy as np
#进行插值的模块
from scipy import interpolate
#保存为pdf的模块
from matplotlib.backends.backend_pdf import PdfPages
#读取excel的模块
import xlrd
#读取excel
book=xlrd.open_workbook('figure7.xls')#获取工作薄对象
print('name of sheet:',book.sheet_names())
names=book.sheet_names()
sheet=book.sheet_by_name('Sheet 1')#获取工作表
#读取对应的数据
x1=sheet.col_values(0)
y1=sheet.col_values(1)
x1=x1[2:18:1]
y1=y1[2:18:1]
x1=np.array(x1)
y1=np.array(y1)
#检验
print(x1)
x2=sheet.col_values(3)
y2=sheet.col_values(4)
x2=x2[2:21:1]
y2=y2[2:21:1]
x2=np.array(x2)
y2=np.array(y2)
x3=sheet.col_values(6)
y3=sheet.col_values(7)
x3=x3[2:17:1]
y3=y3[2:17:1]
x3=np.array(x3)
y3=np.array(y3)
x4=sheet.col_values(9)
y4=sheet.col_values(10)
x4=x4[2:17:1]
y4=y4[2:17:1]
x4=np.array(x4)
y4=np.array(y4)
x5=sheet.col_values(12)
y5=sheet.col_values(13)
x5=x5[2:21:1]
y5=y5[2:21:1]
x5=np.array(x5)
y5=np.array(y5)
x6=sheet.col_values(15)
y6=sheet.col_values(16)
x6=x6[2:14:1]
y6=y6[2:14:1]
x6=np.array(x6)
y6=np.array(y6)
x7=sheet.col_values(18)
y7=sheet.col_values(19)
x7=x7[2:14:1]
y7=y7[2:14:1]
x7=np.array(x7)
y7=np.array(y7)
x8=sheet.col_values(21)
y8=sheet.col_values(22)
x8=x8[2:13:1]
y8=y8[2:13:1]
x8=np.array(x8)
y8=np.array(y8)
x9=sheet.col_values(24)
y9=sheet.col_values(25)
x9=x9[2:12:1]
y9=y9[2:12:1]
x9=np.array(x9)
y9=np.array(y9)
x10=sheet.col_values(27)
y10=sheet.col_values(28)
x10=x10[2:12:1]
y10=y10[2:12:1]
x10=np.array(x10)
y10=np.array(y10)
print(type(y10))
#print(type(x1))
##坐标点
#x1=np.array([1.39343,2.06543,2.6254,3.07328,3.28475,3.63302,3.832,4.16775,4.54073,
#4.78934,5.02547,5.19942])
#y1=np.array([25.60627,48.6796,65.9918,73.4284,75.0902,75.9411,74.313,69.4074,
#59.5717,50.5479,38.2344,26.7379])
#x2=np.array([1.39362,2.48887,3.18585,4.21903,4.89135,5.47672,6.11214,6.63559,
#7.49579,8.39392,8.84328])
#y2=np.array([37.9358,84.069,113.725,168.076,211.707,262.732,332.671,400.957,
#529.291,697.093,799.905])
#x3=np.array([1.70471,2.38917,3.13582,3.60872,4.2559,4.85345,5.53837,6.44789,
#7.3703,8.1061,8.70502,9.09204])
#y3=np.array([47.005,71.7278,95.633,112.938,139.302,173.883,228.205,328.588,
# 457.749,584.428,706.985,799.925])
#平滑处理
tck1 = interpolate.splrep(x1, y1)
x11=np.linspace(x1.min(),x1.max(),100000)
y11 = interpolate.splev(x11,tck1)
tck2 = interpolate.splrep(x2, y2)
x22=np.linspace(x2.min(),x2.max(),100000)
y22 = interpolate.splev(x22,tck2)
tck3 = interpolate.splrep(x3, y3)
x33=np.linspace(x3.min(),x3.max(),100000)
y33 = interpolate.splev(x33,tck3)
tck4 = interpolate.splrep(x4, y4)
x44=np.linspace(x4.min(),x4.max(),100000)
y4 = interpolate.splev(x44,tck4)
tck5 = interpolate.splrep(x5, y5)
x55=np.linspace(x5.min(),x5.max(),100000)
y55 = interpolate.splev(x55,tck5)
tck6 = interpolate.splrep(x6, y6)
x66=np.linspace(x6.min(),x6.max(),100000)
y66 = interpolate.splev(x66,tck6)
tck7 = interpolate.splrep(x7, y7)
x77=np.linspace(x7.min(),x7.max(),100000)
y77 = interpolate.splev(x77,tck7)
tck8 = interpolate.splrep(x8, y8)
x88=np.linspace(x8.min(),x8.max(),100000)
y88 = interpolate.splev(x88,tck8)
tck9= interpolate.splrep(x9, y9)
x99=np.linspace(x9.min(),x9.max(),100000)
y99 = interpolate.splev(x99,tck9)
tck10 = interpolate.splrep(x10, y10)
x1010=np.linspace(x10.min(),x10.max(),100000)
y1010 = interpolate.splev(x1010,tck10)
#tck2 = interpolate.splrep(x2, y2)
#x22=np.linspace(x2.min(),x2.max(),100000)
#y22 = interpolate.splev(x22,tck2)
#tck3 = interpolate.splrep(x3, y3)
#x33=np.linspace(x3.min(),x3.max(),100000)
#y33 = interpolate.splev(x33,tck3)
#图片大小设置
plt.figure(figsize=(8,6))
#线的颜色,线型等设置
a=([1,2,3,4,5,6,7,8,9,10])
print(a,type(a))
for i in a
plt.plot(xii,yii,c='black',linestyle='-')
plt.plot(x11,y11,c='black',linestyle='-',linewidth='0.5')#maker,color,linewidth,linestyle
plt.plot(x22,y22,c='black',linestyle='-',linewidth='0.5')
plt.plot(x33,y33,c='black',linestyle='-',linewidth='0.5')
plt.plot(x44,y44,c='black',linestyle='-',linewidth='0.5')
plt.plot(x55,y55,c='black',linestyle='-',linewidth='0.5')
plt.plot(x66,y66,c='black',linestyle='-',linewidth='0.5')
plt.plot(x77,y77,c='black',linestyle='-',linewidth='0.5')
plt.plot(x88,y88,c='black',linestyle='-',linewidth='0.5')
plt.plot(x99,y99,c='black',linestyle='-',linewidth='0.5')
plt.plot(x1010,y1010,c='black',linestyle='-',linewidth='0.5')
plt.grid(linestyle='-.') #生成网格参数(b,which,axis,color,linestyle,**kwargs)
#在某一点加入文本
#点的标签
plt.text(6.7254,377.66,r'$p$=300alm',ha='center',va='bottom',fontname='Arial',fontsize=10,rotation=50)
plt.text(6.9,384,'200',ha='center',va='bottom',fontname='Arial',fontsize=10,rotation=50)
plt.text(7.06,368,'150',ha='center',va='bottom',fontname='Arial',fontsize=10,rotation=50)
plt.text(7.23,351,'100',ha='center',va='bottom',fontname='Arial',fontsize=10,rotation=50)
plt.text(7.54,325,'50',ha='center',va='bottom',fontname='Arial',fontsize=10,rotation=50)
plt.text(7.76,305,'30',ha='center',va='bottom',fontname='Arial',fontsize=10,rotation=50)
plt.text(7.93,290,'20',ha='center',va='bottom',fontname='Arial',fontsize=10,rotation=50)
#坐标轴范围的设置
plt.xlim(0,10)
plt.ylim(0,800)
#坐标轴名称以及对应的字体属性设置
plt.xlabel(r'Entropy $s$ /[$\mathregular{J·mol^{-1}·K^{-1}}$]',fontname="Arial",fontsize=14)
plt.ylabel(r'Temperature $T$/[K]',fontname="Arial",fontsize=14)
#坐标轴刻度标签设置
a1 = plt.subplot()
a1.set_xticks([0,2,4,6,8,10])
a1.set_xticklabels(('','','','','',''))
a1.set_yticks([0,46,140.25,234.5,328.75,423,517.25,611.5,705.75,800])
a1.set_yticklabels(('','273','373','473','573','673','773','873','973','1073'))#替换刻度下的刻度标签
#坐标轴刻度字体大小设置
a1.tick_params(labelsize=14)
#######背景设计完成
#过程点
pointx=np.array([4.53394,5.54531,8.7034,8.83783,6.97786,7.49186,2.37953,2.37953,5.25672])
pointy=np.array([60.3313,230.435,706.259,541.999,257.657,477.001,60.9757,73.2971,91.6022])
#验证
print(pointx[2])
#绘制过程点
plt.scatter(pointx,pointy,s=8,c='k',zorder=2,marker='o')
#绘制过程线
#直线
plt.plot([pointx[2],pointx[3]],[pointy[2],pointy[3]],c='black',linestyle='-')
plt.plot([pointx[3],pointx[5]],[pointy[3],pointy[5]],c='black',linestyle='-')
plt.plot([pointx[1],pointx[8]],[pointy[1],pointy[8]],c='black')
plt.plot([pointx[1],pointx[4]],[pointy[1],pointy[4]],c='black')
plt.plot([pointx[7],pointx[8]],[pointy[7],pointy[8]],c='black')
plt.plot([pointx[0],pointx[6]],[pointy[0],pointy[6]],c='black')
plt.plot([pointx[6],pointx[7]],[pointy[6],pointy[7]],c='black')
#曲线取点
cx3=sheet.col_values(6)
cy3=sheet.col_values(7)
cx3=cx3[4:15:1]
cy3=cy3[4:15:1]
print('cx3',cx3)
#插入起点终点
cx3.insert(0,2.37953)
cx3.append(8.7034)
cy3.insert(0,73.2971)
cy3.append(706.259)
print(cy3)
cx3=np.array(cx3)
cy3=np.array(cy3)
cx7=sheet.col_values(18)
cy7=sheet.col_values(19)
cx7=cx7[2:11:1]
cy7=cy7[2:11:1]
cx7.append(8.83783)
cy7.append(541.999)
cx7=np.array(cx7)
cy7=np.array(cy7)
#平滑操作
ctck3 = interpolate.splrep(cx3, cy3)
cx33=np.linspace(cx3.min(),cx3.max(),100000)
cy33 = interpolate.splev(cx33,ctck3)
ctck7 = interpolate.splrep(cx7, cy7)
cx77=np.linspace(cx7.min(),cx7.max(),100000)
cy77 = interpolate.splev(cx77,ctck7)
plt.plot(cx33,cy33,c='black',linestyle='-')
plt.plot(cx77,cy77,c='black',linestyle='-')
plt.text(pointx[0],pointy[0]-35,'1',ha='center',va='bottom',fontname='Arial',fontsize=14)
plt.text(pointx[1]-0.05,pointy[1],'2',ha='center',va='bottom',fontname='Arial',fontsize=14)
plt.text(pointx[2],pointy[2],'3',ha='center',va='bottom',fontname='Arial',fontsize=14)
plt.text(pointx[3],pointy[3]-35,'4',ha='center',va='bottom',fontname='Arial',fontsize=14)
plt.text(pointx[4],pointy[4]-35,'5',ha='center',va='bottom',fontname='Arial',fontsize=14)
plt.text(pointx[5]-0.05,pointy[5],'6',ha='center',va='bottom',fontname='Arial',fontsize=14)
plt.text(pointx[6],pointy[6]-35,'7',ha='center',va='bottom',fontname='Arial',fontsize=14)
plt.text(pointx[7],pointy[7],'8',ha='center',va='bottom',fontname='Arial',fontsize=14)
plt.text(pointx[8],pointy[8]-35,'9',ha='center',va='bottom',fontname='Arial',fontsize=14)
plt.tight_layout()#去除空白部分
plt.savefig('figure7.pdf')
代码中的很多重复操作,可以写成函数,但当时直接就写下来了,也没有考虑更多的事情。
未来的有人看到可以写个函数精简一下程序。
成果图因老师著作尚未发表不予公开