前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >工具包 | 使用Python绘制Sci学术期刊配图

工具包 | 使用Python绘制Sci学术期刊配图

作者头像
气象学家
发布2020-10-09 14:59:13
9.6K0
发布2020-10-09 14:59:13
举报
文章被收录于专栏:气象学家气象学家

之前还在讨论Matplotlib没有很好的第三方主题库呢?这不,又被我发现了一个宝藏库,还专门用于一些学术期刊的图表发表,可谓是弥补了matplotlib 繁琐的自定义设置。好了,话不多说,今天这篇推文的主角就是Github 上拥有1.6k 星之多的科学论文图表绘制库「SciencePlots」。推文的主要内如下:

  • SciencePlots 库介绍
  • SciencePlots 实例演示

SciencePlots 库介绍

使用Python-matplotlib绘制科研图表,其默认的颜色和格式并不能满足一般的期刊要求,若想要符合要求,就必须自定义设置,而这个步骤在对面对多幅图表时就显得繁琐和重复。在之前的几篇科学图表绘制推文中Python-matplotlib 学术散点图 EE 统计及绘制 Python-matplotlib 横向堆积柱状图绘制 就定制化表格编写了较多定制化代码。而SciencePlots就是为解决科研图表繁琐设置而定制的一系列科研绘图样式库,可以绘制很合适科研发表的图表。

安装

我们直接可使用pip 直接进行安装,但想要安装最新版本可以采用如下方式:

代码语言:javascript
复制
pip install git+https://github.com/garrettj403/SciencePlots.git

如使用pip稳定安装,则直接使用如下代码:

代码语言:javascript
复制
# for lastest release
pip install SciencePlots

主要样式

SciencePlots 提供了多种用于不同期刊发表要求的主题,接下来我们主要介绍几种主题,注意:由于SciencePlots默认使用Latex字体渲染,而相应软件安装较为麻烦,以下样例均采用禁用Latex字体渲染,即设置 no-latex (数据还是使用官网提供的):

数据构建:

代码语言:javascript
复制
import numpy as np 
import matplotlib.pyplot as plt 
def model(x, p):
    return x ** (2 * p + 1) / (1 + x ** (2 * p))
x = np.linspace(0.75, 1.25, 201)

「原始主题」

代码语言:javascript
复制
fig, ax = plt.subplots(figsize=(4,3),dpi=200)
for p in [10, 15, 20, 30, 50, 100]:
    ax.plot(x, model(x, p), label=p)
ax.legend(title='Order')
ax.set(xlabel='Voltage (mV)')
ax.set(ylabel='Current ($\mu$A)')
ax.autoscale(tight=True)
fig.savefig(r'F:\DataCharm\学术图表绘制\Python-matplotlib\SciencePlots\fig1.png', 
            width=4,height=3,dpi=600)

结果如下:

「science」

代码语言:javascript
复制
with plt.style.context(['science','no-latex']):
    fig, ax = plt.subplots(figsize=(4,3),dpi=200)
    for p in [10, 15, 20, 30, 50, 100]:
        ax.plot(x, model(x, p), label=p)
    ax.legend(title='Order')
    ax.set(xlabel='Voltage (mV)')
    ax.set(ylabel='Current ($\mu$A)')
    ax.autoscale(tight=True)
    fig.savefig(r'F:\DataCharm\学术图表绘制\Python-matplotlib\SciencePlots\fig1_science.png', 
                width=4,height=3,dpi=600)

结果如下:

可以发现:刻度、颜色和图例等发生明显改变。

「IEEE」

代码语言:javascript
复制
with plt.style.context(['ieee','no-latex']):
    fig, ax = plt.subplots(figsize=(4,3),dpi=200)
    for p in [10, 20, 50]:
        ax.plot(x, model(x, p), label=p)
    ax.legend(title='Order')
    ax.set(xlabel='Voltage (mV)')
    ax.set(ylabel='Current ($\mu$A)')
    ax.autoscale(tight=True)
    fig.savefig(r'F:\DataCharm\学术图表绘制\Python-matplotlib\SciencePlots\fig1_ieee.png', 
                width=4,height=3,dpi=600)

结果如下:

当然你还可以进行主题组合:「dark_background+science+high-vis」

代码语言:javascript
复制
with plt.style.context(['dark_background', 'science', 'high-vis','no-latex']):
    fig, ax = plt.subplots(figsize=(4,3),dpi=200)
    for p in [10, 15, 20, 30, 50, 100]:
        ax.plot(x, model(x, p), label=p)
    ax.legend(title='Order')
    ax.set(xlabel='Voltage (mV)')
    ax.set(ylabel='Current ($\mu$A)')
    ax.autoscale(tight=True)
    fig.savefig(r'F:\DataCharm\学术图表绘制\Python-matplotlib\SciencePlots\fig1_science_dark_background.png', 
                width=4,height=3,dpi=600)

结果如下:

更多的例子,大家可以直接去官网进行测试,接下来,我们将主题应用到我们之前绘制过的科学图表绘图代码上。

SciencePlots实例应用

  • 多类别散点图

science:

代码语言:javascript
复制
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
plt.style.use(['science', 'no-latex'])
#plt.rcParams['font.family'] = "Times New Roman"
x = np.arange(0,len(scatter),1)
y1 = scatter.D1.values
y2 = scatter.D2.values
y3 = scatter.D3.values
y4 = scatter.D4.values
y5 = scatter.D5.values
y6 = scatter.D6.values

fig,ax = plt.subplots(figsize=(4,3),dpi=300)
scatter_01 = ax.plot(x,y1,marker='s',lw=.5,label='D1')
scatter_02 = ax.plot(x,y2,marker='s',ls='--',lw=.5,label='D2')
scatter_03 = ax.plot(x,y3,marker='o',lw=.8,ls=':',label='D3')
scatter_04 = ax.plot(x,y4,marker='o',lw=.5,label='D4')

scatter_05 = ax.plot(x,y5,marker='^',lw=.5,ls='-.',label='D5')
scatter_06 = ax.plot(x,y6,marker='^',ls='--',lw=.5,label='D6')
ax.set_ylim(bottom=10,top=45)

ax.legend(frameon=False,ncol=3,loc='upper center',fontsize=8.5)
text_font = {'size':'15','weight':'bold','color':'black'}
ax.text(.88,.88,"(a)",transform = ax.transAxes,fontdict=text_font,zorder=4)
ax.text(.87,-.08,'\nVisualization by DataCharm',transform = ax.transAxes,
        ha='center', va='center',fontsize = 4,color='black',fontweight='bold',family='Roboto Mono')
plt.savefig(r'F:\DataCharm\学术图表绘制\Python-matplotlib\SciencePlots\class_scatter_science.png',width=5,height=3,
            dpi=900,bbox_inches='tight')
plt.show()

结果如下:

ieee:

代码语言:javascript
复制
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
plt.style.use(['ieee', 'no-latex'])
#plt.rcParams['font.family'] = "Times New Roman"
x = np.arange(0,len(scatter),1)
y1 = scatter.D1.values
y2 = scatter.D2.values
y3 = scatter.D3.values
y4 = scatter.D4.values
y5 = scatter.D5.values
y6 = scatter.D6.values

fig,ax = plt.subplots(figsize=(4,3),dpi=300)
scatter_01 = ax.plot(x,y1,marker='s',lw=.5,label='D1')
scatter_02 = ax.plot(x,y2,marker='s',ls='--',lw=.5,label='D2')
scatter_03 = ax.plot(x,y3,marker='o',lw=.8,ls=':',label='D3')
scatter_04 = ax.plot(x,y4,marker='o',lw=.5,label='D4')

scatter_05 = ax.plot(x,y5,marker='^',lw=.5,ls='-.',label='D5')
scatter_06 = ax.plot(x,y6,marker='^',ls='--',lw=.5,label='D6')
ax.set_ylim(bottom=10,top=45)

ax.legend(frameon=False,ncol=3,loc='upper center',fontsize=8.5)
text_font = {'size':'15','weight':'bold','color':'black'}
ax.text(.88,.88,"(a)",transform = ax.transAxes,fontdict=text_font,zorder=4)
ax.text(.87,-.08,'\nVisualization by DataCharm',transform = ax.transAxes,
        ha='center', va='center',fontsize = 4,color='black',fontweight='bold',family='Roboto Mono')
plt.savefig(r'F:\DataCharm\学术图表绘制\Python-matplotlib\SciencePlots\class_scatter_ieee.png',width=5,height=3,
            dpi=900,bbox_inches='tight')
plt.show()

结果如下:

  • 多类别柱形图

science + high-contrast

代码语言:javascript
复制
plt.style.use(['science', 'high-contrast','no-latex'])

labels = ['L1', 'L2', 'L3', 'L4', 'L5']
data_a = [20, 34, 30, 35, 27]
data_b = [25, 32, 34, 20, 25]
data_c = [12, 20, 24, 17, 16]
x = np.arange(len(labels))
width = .25
#plots
fig,ax = plt.subplots(figsize=(5,3),dpi=200)
bar_a = ax.bar(x-width/2, data_a,width,label='category_A')
bar_b = ax.bar(x+width/2, data_b, width,label='category_B')
bar_c = ax.bar(x+width*3/2, data_c,width,label='category_C')
ax.set_xticks(x+.1)
ax.set_xticklabels(labels,size=10)
ax.legend()    

text_font = {'size':'14','weight':'bold','color':'black'}
ax.text(.03,.9,"(a)",transform = ax.transAxes,fontdict=text_font,zorder=4)
ax.text(.87,-.08,'\nVisualization by DataCharm',transform = ax.transAxes,
        ha='center', va='center',fontsize = 5,color='black',fontweight='bold',family='Roboto Mono')
plt.savefig(r'F:\DataCharm\学术图表绘制\Python-matplotlib\SciencePlots\bar_sci_high-contrast.png',width=5,height=3,
            dpi=900,bbox_inches='tight')
plt.show()

结果如下:

当然我们也可以在相关性散点图绘制方法中采用此主题,可视化结果如下:

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2020-09-28,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 气象学家 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • SciencePlots 库介绍
    • 安装
      • 主要样式
        • SciencePlots实例应用
        领券
        问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档