1.1 科研论文配图的绘制基础
1.1.1 绘制规范
不同学术期刊在图名、字体、坐标轴以及颜色选择、配图格式等方面都有其特有的要求。
1.科研论文配图的分类与构成
科研论文配图可分为线性图、灰度图、照片彩图和综合配图 4 种类型。其中,线性图是主要和常用的配图类型。
线性图是指由包括Python、R、MATLAB 等编程软件,以及 Excel、SPSS、Origin(OriginLab 公司出品)等集成软件在内的绝大多数数据分析工具输出的多种插图样式,如折线图、散点图、柱形图等。这类
插图是科技论文中常见的图表类型,也是一种加工费时、设置细节较多的图表类型。
科研论文配图主要包括 X 轴(X axis,又称横轴)、Y 轴(Y axis,又称纵轴)、X 轴标签(X axis label)、Y轴标签(Y axis label)、主刻度(Major tick)、次刻度(Minor tick)和图例(Legend)
等。
- 注意:插图中的标签文本的大小、是否使用斜体、是否添加图例边框、是否添加网格线
2.科研论文配图的格式和尺寸
科研论文中常见的插图格式有像素图和矢量图。其中,像素图(位图)是以单个像素为单位,通过对像素进行组合和排列来显示图片格式。像素图在放大到一定程度后,会失真,变得模糊。常见的像素图格式包括 JPEG、PSD、PNG、TIFF,其中,JEPG 是一种常用的有损压缩图片格式,处理起来较容易,但像素分辨率低、清晰度差、色彩损失大。矢量图是使用点、直线或多边形等基于数学方程的几何图元表示的图像。矢量图的图像文件包含独立的分离图像,可以自由、无限制地进行重新组合,其特点是放大后图像不会失真,也就是说,与分辨率无关。常见的矢量图格式包括 EPS、PDF、AI、SVG,其中,EPS 格式的图片文件小、显示质量高、色彩保真度高,印刷时的字样较为清晰,是常用的论文配图格式;AI 格式是一种可以二次修改的图片格式,也是常用的插图格式,其体积较大,包含图片各图层的所有信息。
对于像素图,一般的科学引文索引(Science Citation Index,SCI)期刊都要求插图的分辨率大于 300dpi(dpi 是表示空间分辨率的计量单位,即每英寸可分辨的点数)。
- 注意:不能一味地追求高分辨率的像素图,因为分辨率太高,相应的插图文件就很大,易造成投稿困难。
3. 科研论文配图中的字体和字号设置
英文科技期刊大多使用 Arial、Helvetica 或 Times New Roman 字体。值得注意的是,单篇科研论文中的所有插图的字体、字号要尽量保持一致,同一幅插图中的字体必须一致。如果插图中确有需要突出的部分,则可以将它们设置为粗体或斜体形式,或者更改文字颜色。
中文期刊字体设置为宋体或黑体。
4. 科研论文配图的版式设计、结构布局和颜色搭配
- 版式设计:配图中文字的字体要保持一致,字号不大于正文字体;行距、文字间距应与正文协调一致。
- 结构布局:配图应出现在引用文字的下方或右侧,“先文后图”;不同尺寸的配图不要安排在同一行或同一列。
- 颜色搭配:避免使用过亮或过暗的颜色,相邻的图层元素不宜采用相近的颜色(特别是在分类插图中华);对于彩色图,我们要使用原图,慎用灰度图表示。
1.1.2 绘制原则
1. 必要性原则
科研论文配图的主要应用场景包括结构表达、体系构建、模型研究、数据预处理及分析、调查统计等。
如何判断是否需要配图?
如果配图可以起到补充说明文字、直观展示结果、引出下文内容等作用,那么它就是必要的。
- 注意:避免文字较少图标较多的情况:无需将原始数据和中间处理过程涉及的插图全部展示在论文中,应在有复杂和多维数据的情况下,提高精选插图的能力,而非简单地对其插图。(过多的插图会消耗大量的绘制时间)
2.易读性原则
方便读者准确理解科研论文配图的内容。
3. 一致性原则
- 配图所表达出的内容与上下文或者指定内容描述一致 :科研论文中的插图虽然可以独
立存在,但也应与上下文中介绍插图的内容或者指定的内容一致。此外,论文配图中
的物理量缩写、符号等都应与论文正文中介绍的保持一致。 - 配图数据与上下文保持一致 :论文配图中的有效数字是根据配图上下文中的实数据或
者不同测量、转换方法等最终确定的。 - 插图比例尺和缩放比例大小保持一致 :涉及地理空间插图的绘制时,插图中包含的比
例尺等图层元素,在修改时应保持与缩放的比例大小相一致 ;在修改插图的大小时,
也应与缩放的比例大小相一致。 - 类似配图各图层要素保持一致 :当论文中出现多个类似配图时,我们应当保证各配图
中的文本属性(大小、字体、颜色)、符号,以及配图中各图层结构等保持一致。
1.2 科研论文配图的配色基础
1.2.1 色彩模式
常见的色彩模式: RGB 色彩模式、CMYK 色彩模式和 HEX 色彩模式
1. RGB色彩模式
RGB 色彩模式是指通过混合红(Red)、绿(Green)、蓝(Blue)3 种颜色来表现各种色彩。该色彩模式利用红、绿、蓝 3 个颜色通道的变化,以及它们相互之间的叠加来得到各种颜色值,是目前使用较为广泛的颜色系统。RGB 色彩模式为图片中每一个像素的 R、G、B 各分配一个强度值(取值范围为 0 ~ 255),如黑色可表示为 (0,0,0),白色可表示为 (255,255,255)。
2. CMYK色彩模式
CMYK 色彩模式可以看作 RGB 色彩模式的子集。它是一种主要用于彩色印刷的四色模型,其中,C 表示青色(Cyan),M 表示品红色(Magenta),Y 表示黄色(Yellow),K 表示黑色(blacK)。与 RGB 色彩模式的不同之处在于,CMYK 色彩模式是一种印刷色彩模式,也是一种依靠反光的色彩模式。尽管RGB 色彩模式表示的颜色更多,但并不表示它们能够全部印刷出来。理论上,把青色、品红色、黄色混合在一起,就可以得到黑色,但是,依照目前的工艺制造水平,三者混合后得到的实际结果是暗红色,因此,我们需要加入一种专门的黑墨来中和,即使用定位套版色(黑色)(Key Plate(Black)),以确保输出黑色。在现阶段,大多数纸质期刊在稿件出版阶段都会要求图片使用 CMYK 色彩模式。对于网络版本的期刊,我们应该使用 RGB 色彩模式,因为使用该色彩模式的图片,其表现效果好,色彩靓丽,更适合在网络上传播。
3. HEX色彩模式
HEX 色彩模式,又称十六进制色彩模式,它和 RGB 色彩模式的原理类似,都是通过红、绿、蓝三原色的混合而产生各种颜色。HEX 色彩模式常用于在代码中表示颜色,这一点方便我们在利用代码绘制科研论文配图时更换颜色。HEX 色彩模式采用 6 位十六进制数来表示颜色,而 RGB 色彩模式中的 R、G、B 则采用 1 个十进制数来表示。简单来说,HEX 色彩模式就是将 RGB 色彩模式中的每个十进制数转换为对应的两位十六进制数来表示,并以“#”号开头,且 3 个字节的顺序如下,字节 1 表示红色值(颜色类型为红色),字节 2 表示绿色值(颜色类型为绿色),字节 3 表示蓝色值(颜色类型为蓝色),1 个字节表示 00 ~ FF 范围内的数字。需要注意的是,HEX 色彩模式中每个字节必须包含两位十六进制数,对于经过十进制数(0 ~ 255)转换后只有一位十六进制数的情况,我们应在这个十六进制数之前补零。例如,十进制数 0 转换为十六进制数后仍为 0,但是,我们要在 HEX 色彩模式中将它表示为“00”。
1.2.2 色轮配色原理
色轮(color wheel)又称色环,一般由 12 种基本颜色按照圆环方式排列组成。它是一种人为规定的色彩排列方式。它不但可以帮助用户更好地研究色彩变换和色彩搭配规律,而且允许用户自行设计具有个人风格的配色方案。常见的色轮配色方案有单色配色方案(monochromatic color scheme)、互补色配色方案(complementary color scheme)、等距三角配色方案(triadic color scheme)和四角配色方案(tetradic color scheme)等
1. 单配色方案
在科研论文配图的绘制过程中,单色配色方案常被用于表示有直接关系、关系较为密切或同系列的数据
- 注意:种类不宜过多,3 ~ 5 种较为合适
2. 互补色配色方案
当只能选择两种颜色时,我们可参考互补色配色方案进行选择。色轮上间隔 180°(相对)
的两种颜色为互补色。互补色具有强烈的对比效果,因此,它可用于科研论文配图中观察组数
据和对照组数据的可视化表达。
3. 等距三角配色方案
等距三角配色方案是指将色轮上彼此间隔 120°的 3 种颜色进行组合。等距三角配色方案会让配图的颜色更加丰富,但它在科研论文配图绘制的过程中应用较少。
4. 四角配色方案
四角配色方案有两种,一种是图 1-2-4(d)中实线表示的两对互补色组成的矩阵配色方案,另一种是图 1-2-4(d)中虚线表示的方形配色方案(square color scheme)。四角配色方案的优点是能够使配图的颜色更加丰富,缺点是使用时具有很大的挑战性,容易造成色彩杂乱,很多用户其实很难平衡自己选择的多种颜色。在科研论文配图的颜色选择过程中,我们要尽量避免使用四角配色方案。
1.2.3 颜色主题
不同的绘图工具(如 Python 中常用的绘图工具 Matplotlib 和 Seaborn)都有其颜色主题。颜色主题是按照一定的美学规律设计出来的,对其灵活使用可以提高插图的美观度。颜色主题对用户(尤其是初学者)友好,使用户不必将大量时间浪费在配色的选择上。用户可根据自身绘图需求选择合适的颜色主题或自定义颜色主题。一些英文期刊会有自己的一套颜色主题,用户在投稿时将插图配色更改为期刊要求的颜色主题即可。
Matplotlib 库的颜色主题主要包括 3 种类型:单色系(sequential)、双色渐变色系(diverging)
和多色系(qualitative)。
1. 单色系
单色系主题中颜色的色相基本相同,饱和度单调递增。它的主要维度是颜色亮度(lightness),一般情况下,较低的数值对应较亮的颜色,较高的数值对应较暗的颜色,这是因为可视化配图往往是在白色或浅色背景上绘制的,而在深色背景中,则会出现相反的情况,即更亮的颜色用更高的数值表示。单色系主题的次要维度是色调(hue),即较暖的颜色出现在较亮的一端,较冷的颜色则会出现在较暗的一端。例如,人口密度的变化就可以使用单色系颜色进行表示。
2. 双色渐变色系
双色渐变色系颜色主题主要用在有一个关键中心值(midpoint)的数值变量中,其本质是两个连续单色系的组合,把关键的中心值作为中间点,一般使用白色表示,大于中心值的分配给中间点一侧的颜色,而小于中心值的分配给中间点另一侧的颜色。此外,我们可以通过颜色的深浅进行判断,即中心值通常被指定为浅色,距中心点越远,颜色越深。
3. 多色系
当所表示的数据为类别型数值(类别变量)时,我们可以使用多色系颜色主题。在多色系颜色主题的使用过程中,需要给每个组分配不同的颜色。一般情况下,可尝试将颜色主题中的颜色类别设置为 10 种或更少,而使用过多的颜色类别,可能造成分组混乱,导致杂乱的视觉效果。当现有的颜色类别无法涉及全部数值时,可将某个数值类别叠加在一起,形成单个其他类别。
1.2.4 配色工具
1. Color Scheme Designer 网站中的高级在线配色器
主要以色环(色轮)的方式为使用者选择配色,包括单色搭配、互补色搭配、三角形搭配、矩形搭配、类
似色搭配和“类似色搭配互补色”6 种色环配色方案.、
该界面包含 4 个区域,介绍如下。
- 黄色框区域为色环配色选择区域,有 6 种色环配色方案可供使用者选择。
- 红色框区域为色环显示区域,图 1-2-15 中的黑色箭头指向的是根据“三角形搭配”方案选择的颜色在色环中的位置。
- 蓝色框区域为配色方案 ID(编号)。
- 绿色框区域为色环配色方案的预览区域。
在这个高级在线配色器的左上角,选择一个配色方案,根据所选方案的不同,色环上会出现不同数量的圆点。单击或拖动色环上的圆点,右侧“配色预览”区域将即时呈现所选配色的预览图。
在选好色环配色方案后,我们可以通过“配色方案调节”选项(见图 1-2-16)进行颜色亮度和饱和度的调整,还可以进行配色对比度的调整;“色彩列表”区域展示该色环配色方案对应的所有 HEX 颜色码。
2. Adobe Color
dobe Color 的色轮配色工具界面包括以下 6 个模块。
- 黄色框区域包含常用的色轮配色方案,有类别色系、单色系、三角色系、互补色系、
正方形色系等。 - 红色框区域为选择色轮配色方案后对应的色轮,拖动白色箭头 ( 红色箭头指示 ),可
以统一调整色相和饱和度。 - 蓝色框区域为选定色轮配色方案对应的颜色,中间色块中的白色三角对应色轮中的白
色箭头。 - 紫色框区域为色块对应的 HEX 颜色码。
- 橙色框区域为可选的色彩模式,包括 RGB、HSB 和 LAB。
- 绿色框区域为色彩模式对应的单个维度颜色值,如 R、G、B 值
3. ColorBrewer 2.0
ColorBrewer 2.0 的操作界面包括下列 8 个模块。
① 表示可选的数据类别数。ColorBrewer 2.0 提供的数据类别数最多 12 个,我们建议将数
据类别数设置为 5 ~ 8 个。
② 表示可选择的颜色主题。ColorBrewer 2.0 提供了单色系(sequential)、双色渐变色系
(diverging)和多色系(qualitative)3 种选项。
③ 表示选定颜色主题后的配色方案。在单色系主题中,还涉及色调的选择,可供选择的
色调类型包括多色调(Multi-hue)和单色调(Single hue)。
④ 表示配色方案输出时的注意事项,即用户是否需要考虑色盲情形(colorblind safe)、是
否友好打印(print friendly)等。
⑤ 表示具体搭配色系的输出模式及对应的颜色码,可选择的格式包括 HEX、RGB 和
CMYK。
⑥ 用于控制不同颜色搭配方案的一些属性,包括道路(roads)、城市(cities)和边界线
(borders),用户可以用不同的颜色表示它们。
⑦ 表示背景设置区域。背景设置包括纯色(solid color)和地形(terrain)两个选项。用
户还可以设置背景颜色的透明度(color transparency)。
⑧ 展示不同颜色搭配方案的预览效果。
1.3 实操
1.3.1 折线图绘制
import numpy as np
import pandas as pd
import seaborn as sns
import proplot as pplt
import openpyxl
import matplotlib.pyplot as plt
from proplot import rc
rc["font.family"] = "Times New Roman" ## 设置字体
# 设置坐标轴轴、标签、标题字体大小
rc["axes.labelsize"] = 15
rc['tick.labelsize'] = 13
rc["suptitle.size"] = 15
plt.style.use('science','ieee') ## 设置期刊格式
data = pd.read_excel(r"基本构成示意绘图数据.xlsx")
#proplot 方法绘制
fig = pplt.figure(figsize=(4.5,3.5))
ax = fig.subplot()
ax.format(abc='(a.)', abcloc='ul',abcsize=20,xlabel='Time', ylabel='Values',
xlim=(-2,40),ylim=(-8,30))
selsect = ["A","B","C","D"]
colors = ["#2FBE8F","#459DFF","#FF5B9B","#FFCC37"]
for index,color in zip(selsect,colors):
data_selcet = data.loc[data['type']==index,:]
ax.errorbar(x=data_selcet["time"],y=data_selcet["mean"],yerr=data_selcet["sd"],color="k", linewidth=1,marker='o',ms=10,mew=1,mec='k',mfc=color,capsize=5,label=index)
ax.legend(ncols=4, frame=True,loc='t')
#fig.save(r"\第1章 科研论文配图的绘制与配色基础\\图1-1-1 科研论文配图基本构成示意图.svg"
plt.show()
1.3.2 直方图
menMeans = (5, 15, 30, 40)
menStd = (2, 3, 4, 5)
ind = np.arange(4)
width= 0.7
labels = ('A', 'B', 'C', 'D'
colors=["#1826B0","#4C59D8","#717BD8","#081272"]
fig,ax = plt.subplots(figsize=(4,3),dpi=100,facecolor="w")
for name,value,err,label,color in zip(labels,menMeans,menStd,labels,colors):
ax.bar(name,value,yerr=err,label=label,color=color,ec="k",lw=.8,
capsize=5,error_kw={'linewidth':1})
for spine in ["top","right"]:
ax.spines[spine].set_visible(False)
ax.grid(False)
ax.set_ylim(0,50)
ax.legend(frameon=False,handlelength=1.5,handleheight=1.5)
plt.show()
1.3.3 饼图
sizes = [30, 70]
labels = ['A','B']
colors=["#1826B0","#FFBA00"]
fig,ax = plt.subplots(figsize=(4,3.5),dpi=100,facecolor="w")
explode = (0, 0.,)
ax.pie(sizes, explode=explode, labels=labels, autopct='%1.1f%%',
shadow=False, startangle=90,colors=colors,
wedgeprops={'linewidth':.8, 'edgecolor': 'k'},
textprops={'size': 12,"color":"w"})
ax.legend(labels,loc ='upper left',fontsize=9,handlelength=1.2,handleheight=1.2)
plt.tight_layout()
plt.show()
1.3.4 小提琴图
- 中位数(小提琴图上的一个白点)
- 四分位数范围(小提琴中心的黑色条)。
- 较低/较高的相邻值(黑色条形图)–分别定义为第一四分位数-1.5 IQR和第三四分位数+1.5 IQR。这些值可用于简单的离群值检测技术,即位于这些 "栅栏"之外的值可被视为离群值。
与箱形图相比,小提琴图毫无疑问的优势在于:除了显示上述的统计数据外,它还显示了数据的整体分布。这个差异点很有意义,特别是在处理多模态数据时,即有多峰值的分布。
# a)Matplotlib的默认颜色主题
matplotlib_colors = ['#1f77b4', '#ff7f0e', '#2ca02c', '#d62728']
fig,ax = plt.subplots(figsize=(3,3.2),dpi=100,facecolor="w")
ax = sns.violinplot(x="day", y="total_bill", data=tips,
palette=matplotlib_colors,
saturation=1)
for spine in ["top","right"]:
ax.spines[spine].set_visible(False)
ax.grid(False)
ax.set_ylim(-10,60)
ax.set_xlabel("Class")
ax.set_ylabel("Value")
plt.tight_layout()
plt.show()
# b)Seaborn的默认颜色主题
fig,ax = plt.subplots(figsize=(3,3.2),dpi=100,facecolor="w")
ax = sns.violinplot(x="day", y="total_bill", data=tips,saturation=1)
for spine in ["top","right"]:
ax.spines[spine].set_visible(False)
ax.grid(False)
ax.set_ylim(-10,60)
ax.set_xlabel("Class")
ax.set_ylabel("Value")
plt.tight_layout()
plt.show()
# c)SciencePlots的默认颜色主题(需安装Scienceplots包(pip install SciencePlots),不同版本引用方式有所不同,请注意!)
with plt.style.context(['science']):
from proplot import rc
rc["xtick.minor.visible"] = False
rc["ytick.minor.visible"] = False
rc["xtick.major.pad"] =5
fig,ax = plt.subplots(figsize=(3,3.2),dpi=100,facecolor="w")
ax = sns.violinplot(x="day", y="total_bill", data=tips,saturation=1)
for spine in ["top","right"]:
ax.spines[spine].set_visible(False)
ax.tick_params(top=False,right=False)
ax.grid(False)
ax.set_ylim(-10,60)
ax.set_xlabel("Class")
ax.set_ylabel("Value")
plt.tight_layout()
plt.show()
1.3.5 散点图
# a)单色系可视化绘制示例
with plt.style.context(['science']):
from proplot import rc
rc["xtick.minor.visible"] = False
rc["ytick.minor.visible"] = False
rc["xtick.major.pad"] =5
fig,ax = plt.subplots(figsize=(3,3.2),dpi=100,facecolor="w")
scatter = ax.scatter(x="total_bill",y="tip",c="tip",data=tips,ec="k",
cmap="YlGnBu")
for spine in ["top","right"]:
ax.spines[spine].set_visible(False)
ax.tick_params(top=False,right=False)
cax = ax.inset_axes([0.1, .85, 0.6, 0.05], transform=ax.transAxes)
colorbar = fig.colorbar(scatter, ax=scatter, cax=cax,
orientation="horizontal")
colorbar.ax.tick_params(bottom=True,direction="in",labelsize=8,pad=3)
colorbar.ax.xaxis.set_ticks_position('top')
colorbar.outline.set_linewidth(.4)
ax.grid(False)
ax.set_ylim(0,12)
ax.set_xlabel("X Label")
ax.set_ylabel("Y Label")
plt.tight_layout()
plt.show()
# b)双色渐变色系可视化绘制示例
with plt.style.context(['science']):
from proplot import rc
rc["xtick.minor.visible"] = False
rc["ytick.minor.visible"] = False
rc["xtick.major.pad"] =5
fig,ax = plt.subplots(figsize=(3,3.2),dpi=100,facecolor="w")
scatter = ax.scatter(x="total_bill",y="tip",c="tip",data=tips,ec="k",
cmap="seismic")
for spine in ["top","right"]:
ax.spines[spine].set_visible(False)
ax.tick_params(top=False,right=False)
cax = ax.inset_axes([0.1, .85, 0.6, 0.05], transform=ax.transAxes)
colorbar = fig.colorbar(scatter, ax=scatter, cax=cax,
orientation="horizontal")
colorbar.ax.tick_params(bottom=True,direction="in",labelsize=8,pad=3)
colorbar.ax.xaxis.set_ticks_position('top')
colorbar.outline.set_linewidth(.4)
ax.grid(False)
ax.set_ylim(0,12)
ax.set_xlabel("X Label")
ax.set_ylabel("Y Label")
plt.tight_layout()
plt.show()
# c)多色系可视化绘制示例
with plt.style.context(['science']):
from proplot import rc
rc["xtick.minor.visible"] = False
rc["ytick.minor.visible"] = False
rc["xtick.major.pad"] =5
fig,ax = plt.subplots(figsize=(3,3.2),dpi=100,facecolor="w")
scatter = ax.scatter(x="total_bill",y="tip",c="tip",data=tips,ec="k",
cmap="Set1")
for spine in ["top","right"]:
ax.spines[spine].set_visible(False)
ax.tick_params(top=False,right=False)
cax = ax.inset_axes([0.1, .85, 0.6, 0.05], transform=ax.transAxes)
colorbar = fig.colorbar(scatter, ax=scatter, cax=cax,
orientation="horizontal")
colorbar.ax.tick_params(bottom=True,direction="in",labelsize=8,pad=3)
colorbar.ax.xaxis.set_ticks_position('top')
colorbar.outline.set_linewidth(.4)
ax.grid(False)
ax.set_ylim(0,12)
ax.set_xlabel("X Label")
ax.set_ylabel("Y Label")
plt.tight_layout()
plt.show()