教你三种方法,用Python搞定出版级论文配图绘制

Hello,大家好,我是Alex~

今天我给大家介绍下如何使用Python-Matplotlib库一步步绘制可以用于出版的图表(Publication Ready Plots)。接下来,将通过一个具体的小例子给大家讲解一下绘制流程,当然,最后还会介绍现成的第三方包绘制的绘制方法。

Python-Matplotlib 绘制

首先,我们通过生成虚拟数据,使用matplotlib默认的颜色和图表样式进行绘制,如下:

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)

Default Plots Style Of matplotlib

接下来,我通过一步步对其绘图属性进行更改,使其符合出版级别的要求。

1.「设置全局图表属性变量」

这一步对于有绘制较多图表的小伙伴有很大帮助,通过在绘制图表之前通过如下代码,分别更改字体、字体大小、线宽、刻度等多个常见属性,如下(这里只更改所需内容):

plt.rcParams['font.family'] = 'Times New Roman'

plt.rcParams['font.size'] = 18

plt.rcParams['axes.linewidth'] = 2

以上分别设置全局字体为Times New Roman,字体大小为18,轴宽度为2。当然,需要对个别字体进行设置的,可通过局部更改属性即可。更多全局变量属性可参考:rcParams

     2.「移除轴脊(spines)」

有的图表要求对部分轴脊(通常是上、右)进行去除,可通过如下代码实现:

ax.spines['right'].set_visible(False)

ax.spines['top'].set_visible(False)

Example Of Remove spines

    3.「刻度属性(Tick Parameters)」

刻度属性设置可是我每次使用matplotlib绘制图表使用最多的语句了,可以设置刻度长短、粗细、方向、刻度标签等。下面只是对部分属性进行设置:

# 通过如下代码添加副刻度

from matplotlib.pyplot import MultipleLocator

fig, ax = plt.subplots(figsize=(4,3),dpi=200)

#修改次刻度

yminorLocator = MultipleLocator(.25/2) #将此y轴次刻度标签设置为0.1的倍数

xminorLocator = MultipleLocator(.25/2)

ax.yaxis.set_minor_locator(yminorLocator)

ax.xaxis.set_minor_locator(xminorLocator)

ax.tick_params(which='major', length=5, width=1.5, direction='in', top='on',right="on")

ax.tick_params(which='minor', length=3, width=1,direction='in', top='on',right="on")

Example Of Tick Parameters

更多tick_params参数,可参考:tick_params

    4.「Axis labels」通过如下代码添加Axis labels:

ax.set_xlabel('Voltage (mV)', fontsize=13,labelpad=5)

ax.set_ylabel('Current ($\mu$A)', fontsize=13,labelpad=5)

其中labelpad=5 用于调整轴标签和刻度标签之间的距离

    5.「汇总」这一步,我们将之前全部的设置都应用到之前默认的Matplotlib绘制的图表上,代码如下:

plt.rcParams['font.family'] = 'Times New Roman'

plt.rcParams['font.size'] = 12

plt.rcParams['axes.linewidth'] = 1

# 设置图例标题大小

plt.rcParams['legend.title_fontsize'] = 9

fig, ax = plt.subplots(figsize=(4,3),dpi=200)

colors = ["#0073C2","#EFC000","#868686","#CD534C","#7AA6DC","#003C67"]

for p,c in zip([10, 15, 20, 30, 50, 100],colors):

    ax.plot(x, model(x, p), color=c,label=p)

#修改次刻度

yminorLocator = MultipleLocator(.25/2) #将此y轴次刻度标签设置为0.1的倍数

xminorLocator = MultipleLocator(.25/2)

ax.yaxis.set_minor_locator(yminorLocator)

ax.xaxis.set_minor_locator(xminorLocator)

#修改刻度属性

ax.tick_params(which='major', length=5, width=1.5, direction='in', top='on',right="on")

ax.tick_params(which='minor', length=3, width=1,direction='in', top='on',right="on")

# 添加axis label

ax.set_xlabel('Voltage (mV)', fontsize=13,labelpad=5)

ax.set_ylabel('Current ($\mu$A)', fontsize=13,labelpad=5)

#添加网格

ax.grid(which='major',ls='--',alpha=.8,lw=.8)

#添加图例

ax.legend(fontsize=8,loc='upper left',title="Order")

# 添加文本信息

ax.set_title("Default Plot Style Of Matplotlib",fontsize=14,pad=10)

ax.text(.87,.06,'\nVisualization by DataCharm',transform = ax.transAxes,

        ha='center', va='center',fontsize = 5)

Example Of Customize set charts in Matplotlib

第三方库绘制

这一部分我们使用Python绘制出版级别的图表的优秀第三方库:SciencePlots和proplot,前者是提供多个matplotlib绘图主题以应对不同期刊绘制要求,后者则是对Matplotlib进行再一次的加工封装,使其绘制复杂严谨的科学图表不再局限于Matplotlib本身的局限性。接下来,我将使用这两个库对其上述数据进行可视化绘制。

SciencePlots 库绘制

这个库可谓是Python绘制出版级别图表的绝对利器,使用只需直接调用主题即可,如下:

with plt.style.context(['science','grid','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.set(title="Scienceplots Plot Style Example Of Matplotlib")

    ax.autoscale(tight=True)


Example Of SciencePlots style


可以看出:只需开始之前调用绘图主题,就可以省去Matplotlib繁琐的定制化操作,而且该库还上线了Nature图表主题(style for Nature articles),更多详细内容可参考:SciencePlots 库官网

proplot库绘制

这里,我们使用该库绘制,如下:

import proplot as plot

fig, ax = plot.subplots(figsize=(4,3.5),dpi=100)

for p in [10, 15, 20, 30, 50, 100]:

    ax.plot(x, model(x, p), label=p)

ax.format(title='Example Of Proplot Plot Style',abc=True, abcloc='ur', abcstyle='(A)',

          xlabel='Voltage (mV)', ylabel='Current ($\mu$A)',

          xtickdir='in',ytickdir="in",xtickloc="both",ytickloc="both",xgridminor=False,

          ygridminor=False

)

ax.legend(ncols=1)

Example Of Proplot make

可以看出:proplot库实现了对matplotlib的再一次封装,简化其繁琐的定制化绘制过程,同时也对matplotlib 默认的刻度、网格等图表属性进行了修改,使其更加符合出版级别的要求。更多内容可参考:proplot库官网

总结

今天,我汇总了三种Python绘制出版级别图表的方法:

matplotlib:一步步定制化操作。自由度较高,但需熟悉较多的绘图函数和参数熟悉。

SciencePlots :提供较多的符合各种期刊要求的matplotlib绘图主题,使用简单。但对要求高的绘制需求满足度较低。

proplot:对matplotlib进行了封装,简化绘图过程,提供符合出版级别的图层熟悉设置,但可能需要你重新熟悉一整个绘图语句。

综上,大家可以合理的学习自己的工具绘制出版级别的论文配图哈~~

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,287评论 6 498
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,346评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,277评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,132评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,147评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,106评论 1 295
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,019评论 3 417
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,862评论 0 274
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,301评论 1 310
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,521评论 2 332
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,682评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,405评论 5 343
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,996评论 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,651评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,803评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,674评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,563评论 2 352

推荐阅读更多精彩内容