Python重绘论文中的数据图

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')

代码中的很多重复操作,可以写成函数,但当时直接就写下来了,也没有考虑更多的事情。
未来的有人看到可以写个函数精简一下程序。

成果图因老师著作尚未发表不予公开

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值