专栏首页气象学家工具包 | 使用Python绘制Sci学术期刊配图

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

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

  • SciencePlots 库介绍
  • SciencePlots 实例演示

SciencePlots 库介绍

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

安装

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

pip install git+https://github.com/garrettj403/SciencePlots.git

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

# for lastest release
pip install SciencePlots

主要样式

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

数据构建:

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)

「原始主题」

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」

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」

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」

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:

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:

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

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

结果如下:

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

本文分享自微信公众号 - 气象学家(Meteorologist2019)

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2020-09-28

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • Python-matplotlib 学术散点图完善

    上期的推文Python-matplotlib 学术型散点图绘制 推出后,很多小伙伴比较喜欢

    气象学家
  • 动态曲线图(linechart)--Matplotlib绘制

    配上动感的音乐感觉就是不一样啊,要达到上述效果除了核心的Matplotlib绘图外,其他工具和上篇推文 Hans Rosling Charts Matplotl...

    气象学家
  • Python教程 | 最标准的地图调用方式(国家测绘局提供数据)

    天地图是国家测绘地理信息局建设的地理信息综合服务网站,是国家地理信息公共服务平台的公众版。 与常用的谷歌地图、腾讯地图、百度地图、微软地图、必应地图相比,天地图...

    气象学家
  • 搭建ffmpeg player -- 整体思想介绍

    project 采用 Android MediaPlayer生命周期 + Gstreamer pipeline的思想框架来构建.

    小蚂蚁与大象
  • 最终一轮面试被 Google 刷掉,这是一种什么样的体验?

    我应聘的是位于美国密歇根安娜堡分公司的 Associate Account Strategist,实质上是谷歌前线业务的销售岗,归谷歌 AdWords 部门管辖...

    程序员宝库
  • 程序员面试被套路,被卖了还给人数钱!网友:只要套路深,铁柱磨成针

    有的程序员为了能够得到一个面试机会也是蛮拼的了,周围的一个朋友住在北京的郊区,面试时间是在早上,为了能够按时面试,面试前一天晚上就在北京住了一个酒店,为了怕早上...

    一墨编程学习
  • 一名程序媛的高级Android面试总结

    现在的市场环境确实不大好,裁员与及在预谋裁员的公司一大把,当然招人的公司也有。楼主这几天去面试了几家公司,目的有以下几点:

    Android技术干货分享
  • 硅谷企业面试的感受

    在过去的几年里,各类公司的面试我都有所经历,小到十人左右的创业公司,大到几万人的腾讯阿里,面试过程大同小异。 但是最近又有新的收获,故开此篇以分享具体的过程和...

    落影
  • 2年Java开发工作经验面试总结

    最近换了个公司,从三月底开始面,面到四月底,面了有快二十家公司。我是一个喜欢总结经验的人,每经过一场面试,我在回来的路上都会仔细回想今天哪些问题可以答的更好,或...

    Java团长
  • 2年Java开发工作经验面试总结

    最近换了个公司,从三月底开始面,面到四月底,面了有快二十家公司。我是一个喜欢总结经验的人,每经过一场面试,我在回来的路上都会仔细回想今天哪些问题可以答的更好,或...

    Java高级架构

扫码关注云+社区

领取腾讯云代金券