1. 编辑部为什么死磕“黑白”这条要求
第一次因为图片被退修,修改意见里没有一句提到数据,只写了一行:图 2、图 4 请改为黑白图。当时我的第一反应是“这不是故意为难人吗”,毕竟那两张图是我用默认配色画出来的多曲线折线图,红蓝绿三条线,在屏幕上看得清清楚楚。后来把图转成灰度一打印,三条线糊成一团灰,我才明白这条要求不是形式主义,而是在保护图本身的可读性。投稿要求图片用黑白图,本质上是要求作者保证这张图在单色印刷、复印、扫描、以及读者用黑白激光打印机打出来的场景下,依然能把该说的信息说清楚。这篇内容就是把我这些年踩过的、以及帮别人改图时反复见到的坑整理出来,从“为什么要黑白”讲到“怎么转才不塌”,再到“交稿前怎么自检”,适合正在准备投稿、尤其是第一次投工程应用类期刊的朋友直接照着做。
1.1 单色印刷的成本账决定了这条硬规矩
多数期刊的正文采用单色胶印,彩页需要单独上机、单独制版,还可能涉及插页和纸张匹配的问题,成本不是“贵一点”的量级,而是按页翻倍甚至更多。所以编辑部在投稿须知里写“图片请使用黑白图”,实际上是在源头控制彩版数量。有些期刊确实保留了少量彩版额度,但通常优先给封面、封二,或者需要额外付费,普通作者投稿时默认走黑白通道是最稳妥的。
更关键的一点是:如果作者不自己转,排版环节也会转。排版软件把彩色图灰度化,用的是默认算法,作者完全无法控制转换后的对比度、线条是否还能区分、图例里的色块会不会全部变成同一个灰。我在修改稿里见过最惨的情况是,一张原本用红绿区分“预测值”和“实测值”的散点图,转成灰度后两组点亮度几乎一样,读者根本分不清哪组是哪组,而这在作者自己的电脑上永远看不出来。所以这条要求的潜台词是:请你亲自完成这次转换,并且对转换结果负责。
1.2 “黑白”到底指二值、灰度,还是“不带彩色信息”
这三个概念经常被混着说,但操作上差别很大。二值图只有纯黑和纯白两个值,适合流程框图、示意图、纯线条结构图;灰度图有 256 级灰,适合照片、渲染图、热力图、带填充的柱状图;而“不带彩色信息”是一个更宽泛的判定标准,指的是这张图在 RGB 三个通道上的数值一致,或者干脆保存为单通道。
判断标准其实很简单:把图转成灰度之后,图上每一个元素所承载的信息没有丢失。如果转完之后两条曲线分不开了、图例的色块变成一样的灰、热力图的层次塌成一片,那这张图就没有通过这条要求,哪怕它在文件属性里显示的确实是“灰度模式”。我一般的处理原则是:示意图和框图尽量做成接近二值的黑白线条图,数据图做成层次分明的灰度图,这条原则在绝大多数工程应用类期刊里都适用。
1.3 哪些图最容易在这一关被挡下来
被退修的黑白图问题,八成集中在几类场景:Word 或 PPT 里直接复制粘贴过去的图表、Excel 默认配色生成的柱状图、屏幕截图、软件默认 colormap 渲出来的热力图、以及用红绿黄这种等高亮度色系区分数据系列的折线图。这几类的共同点是“在屏幕上好看,转灰度就废”。
还有一类容易被忽略:图本身是灰度的,但保存成了 RGB 三通道的 TIFF 或 PNG。文件看起来是灰的,可投稿系统自动检测时会判定为彩色图,触发人工复核,白白多等一轮。这个坑我在早期投稿时踩过两次,后来养成习惯,出图最后一步一定确认图像模式是“灰度”而不是“RGB”。
2. 先给图分类,再谈分辨率和格式
很多人在这一步犯的错是“所有图统一 300 dpi 导出”,结果线条图边缘发虚,照片类图又太大。图片的处理方式取决于它属于哪一类,先分类再定参数,比盲目调高 dpi 有效得多。
2.1 三类图的参数对照
| 图的类型 | 典型内容 | 有效分辨率要求 | 推荐格式 | 说明 |
|---|---|---|---|---|
| 线条图、示意图 | 流程框图、系统结构图、电路示意、纯线条曲线 | 位图等效 600–1200 dpi,或直接给矢量 | EPS、PDF、高分辨率 TIFF | 线条图对分辨率最敏感,锯齿最明显 |
| 灰度连续调图 | 照片、渲染图、显微图、热力图、地形图 | 300 dpi(部分期刊要求 600) | TIFF(LZW 无损压缩) | 不要用 JPEG |
| 组合图 | 照片上叠线条、标注、箭头 | 不低于 600 dpi | TIFF 或 PDF | 按其中要求最高的那类走 |
这张表里的数字不是随便写的。灰度连续调图在印刷时要经过加网,300 dpi 已经能保证在正常阅读距离下人眼分辨不出网点;而线条图的边缘是硬边,一旦出现锯齿就非常刺眼,所以要求翻倍。至于 EPS 和 PDF,它们本质上是矢量描述,理论上无限放大不失真,但如果里面嵌了位图,嵌入的那部分仍然要满足上面的分辨率要求。
2.2 有效 dpi 是按最终版面尺寸算的,不是按你电脑上的显示尺寸
这是最容易被误解的一点。一张 2400×1800 像素的图,你的看图软件显示“300 dpi”,这个 300 是它自己假设的物理尺寸下的结果,跟期刊排版后的实际尺寸毫无关系。真正的有效 dpi 要按图在版面上最终占多宽来算:
有效 dpi = 图片像素宽度 ÷(版面宽度 mm ÷ 25.4)
举两个实际算例。国内期刊正文常见单栏宽度约 80 mm、双栏通栏约 170 mm。若一张图宽 1600 像素,排在单栏:80 ÷ 25.4 ≈ 3.15 英寸,1600 ÷ 3.15 ≈ 508 dpi,绰绰有余;同样这张图如果被排成通栏 170 mm:170 ÷ 25.4 ≈ 6.69 英寸,1600 ÷ 6.69 ≈ 239 dpi,就不够 300 了。反过来说,一张 2400 像素宽的图排在通栏下约 359 dpi,达标。
所以出图时的正确做法是:先确定这张图在版面上大概占多宽,按这个物理尺寸去设置画布大小,再让 dpi 达到要求。在 MATLAB 和 matplotlib 里都可以直接按英寸或厘米设画布,这一步做了,后面基本不会出问题。
2.3 字号和线宽比分辨率更容易被忽略
很多人把 dpi 调到 600 就以为万事大吉,结果排版后图里的坐标轴刻度字只有 4 pt,印刷出来像一排小黑点。经验值是:图中文字最终印刷尺寸不小于 6 pt,建议 7–8 pt;曲线线宽不小于 0.25 mm(约 0.7 pt);标记点大小 4–6 pt;坐标轴框线 0.5–0.75 pt。
这里有个反直觉的点:如果你的图画布设得很大、字号也设得很大,但排版时被缩小了一半,实际字号就只剩一半。所以我不建议把画布设得过大然后靠缩小来适配版面,正确的顺序是“按最终物理尺寸出图 + 按最终尺寸设字号”,所见即所得。为了验证,把图插入一个按真实版面宽度排好的文档里,缩放到 100% 打印出来看,一眼就知道字够不够大。
3. 彩色转灰度的四种做法,各自会出什么问题
同样是“把图变灰”,不同做法出来的结果可能天差地别。下面这四种我都在实际项目里用过,各自的适用场景和翻车点差别很明显。
| 方法 | 操作要点 | 优点 | 主要问题 |
|---|---|---|---|
| 直接改图像模式 | 一步转灰度 | 快,无损于位图结构 | 等亮度的不同颜色会塌成同一个灰 |
| 通道混合器自定义权重 | 手动调 R/G/B 权重 | 能针对性拉开对比 | 需要理解各系列的颜色构成,费时间 |
| 绘制阶段就换配色 | 灰度 colormap、线型标记 | 一次做对,后续零成本 | 需要改代码或改绘图设置 |
| 阈值二值化 | 设定阈值转黑白 | 线条干净、文件小 | 只适用于纯线条图,细线易断 |
3.1 直接改模式:最省事,也最容易塌
通用的灰度转换用的是亮度加权,大致是 0.299R + 0.587G + 0.114B 这一套系数。这个公式意味着绿色对最终灰度的贡献最大,蓝色几乎可以忽略。于是就会出问题:一组用红色(255,0,0)和绿色(0,255,0)区分的数据,转灰度后亮度分别约为 76 和 150,勉强还能分;但如果用的是红(255,0,0)和蓝(0,0,255),转完是 76 和 29,在深色区域几乎贴在一起;再用黄(255,255,0,亮度约 226)和青(0,255,255,亮度约 179),看着是两种完全不同的颜色,转完却是一对相近的浅灰。
我在一个项目里遇到过更极端的情况:四条曲线分别用蓝、紫、品红、深红,在屏幕上区分度极好,转灰度后四条线全落在 30–60 这个窄区间里,打印出来就是一根粗线。这不是分辨率问题,是颜色选错了。
3.2 通道混合器:手工把对比“抢”回来
如果你不想重画,只想救图,通道混合器是有效手段。以常见的图像处理软件为例,进入灰度转换界面后勾选“单色”,然后手动调三个通道的百分比,比如把红色通道权重从 30% 拉到 70%、绿色降到 20%、蓝色降到 10%,红色系列会立刻变深,和蓝色系列拉开差距。核心逻辑是:哪个数据系列的颜色你不满意,就提高它的补色通道权重或者压低它本身通道的权重。
这个方法的代价是需要试。我一般的流程是:先转一版,看一眼灰度直方图和各系列的实际灰度值(用取色器点一下),如果两条曲线的灰度差小于 20%,就继续调权重,直到差距拉到 30% 以上为止。另外提醒一句,调完权重通常会损失整体的明暗平衡,图里如果有照片或渐变底,可能会发灰发脏,所以这个方法更适合纯线条图和柱状图,不适合夹着照片的组合图。
3.3 在绘制阶段就换配色:真正省事的路
最省事的做法其实是在画图的时候就不用彩色。具体到绘图工具,就是把 colormap 换成灰度,把数据系列的区分从颜色编码改成形状编码,也就是线型加标记。这条路的成本是一次性改代码,收益是以后再也不用为转灰度操心,而且图像质量最好,因为不经过二次转换。
判断自己有没有做到位,有个简单办法:把屏幕显示切到灰度预览,或者直接把图打印成黑白,如果这时候还能一眼分清每条线,就合格了。
3.4 二值化:只对纯线条图成立
阈值二值化把所有像素压到纯黑或纯白,线条图会变得非常干净锐利,文件也小。但它有两个前提:一是原图必须是纯线条、没有渐变和半透明,二是线条本身不能太细,否则抗锯齿产生的浅灰边缘被压掉之后,细线会断裂成虚线。
我通常的做法是先把灰度图做一次轻微的对比度拉伸,让线条更黑、背景更白,然后再二值化,阈值取在 128 附近,如果细线断了就往上调到 160–180 试。对于带填充色的框图、带阴影的示意图,不要用二值化,老老实实做灰度。
4. 三类高危图表的改造实录
原理讲完,落到具体图表上,问题会变得非常具体。下面这三类是我改得最多、也最容易出问题的。
4.1 多曲线折线图:把颜色编码换成形状编码
一张图里三条以上曲线,而且靠颜色区分,这是黑白化之后的头号问题上图。改造思路是三重编码叠加:
第一重是线型,实线、虚线、点划线、点线,四种基本够用,超过四种就该考虑拆图了。第二重是标记,圆圈、方块、三角、菱形、叉、加号,注意标记要间隔放置(每隔 N 个数据点一个),否则密集成一条粗线反而更乱。第三重是灰度层次,纯黑、40% 灰、60% 灰、80% 灰,四级足够。
这里有两条实操经验。一是灰度层次不要用太浅的,印刷网点在低于 10% 和高于 90% 的区域最容易并糊,浅灰线复印一次就消失了,所以四级灰建议取 0%、40%、60%、80%,不要取 0%、15%、30%、45% 这种。二是图例能省则省,直接在曲线末端或曲线旁边标注名称,用引线指过去,比为每条线配一个图例色块可靠得多,也省版面。
还有一个细节:网格线。原始图里为了配合彩色,往往把网格线设得很淡,转灰度后网格线和浅灰曲线混在一起。建议网格线只保留主刻度,用点线,灰度不低于 70%。
4.2 柱状图和分组柱:图案填充的几个参数
柱状图的黑白化靠图案填充(hatch)。常见的图案有斜线、反向斜线、网格、交叉线、点阵、横线、竖线,组合起来区分六到八组没问题。参数上有几个容易忽略的点:
图案线条的粗细要跟柱子的边框线协调,一般图案线 0.5 pt 左右,边框线 0.75–1 pt。图案密度要控制,太密会变成实心黑,太疏会看起来像几条孤立的线,斜线间距建议取柱宽的 8%–12%。图案的方向要交替使用,相邻两根柱子一个 45 度、一个 -45 度,区分度立刻上来。
误差线在黑白图里容易和图案混在一起,建议把误差线做成带端帽的实线、线宽略粗,并且和图例里单独说明。如果分组超过六组,我一般建议拆成两张子图或用表格,硬塞进去读者也看不出来。
4.3 热力图和伪彩图:默认彩色映射转灰度会带来明显问题
这是所有类型里问题最严重的。很多软件默认的彩色映射(那种蓝—青—黄—红的彩虹色阶)在亮度上是非单调的:中间黄绿色最亮,两端深蓝和深红最暗。转成灰度之后,最暗的两端塌成同一个黑,读者看到一个深色区域,根本不知道它代表最大值还是最小值,这张图的信息就丢了一半。
改造方案有四条,可以叠加使用。第一,直接把 colormap 换成灰度,并且确认它是单调的(从黑到白或从白到黑),不要用那种来回震荡的。第二,叠加等值线,用细黑线画出关键阈值,这样即使灰度层次看不清,等值线也能提供定量信息。第三,在图上标注关键点的数值,尤其是极大值、极小值和拐点。第四,如果曲面形状本身能编码信息,可以再叠加纹理(点密度图),用点的疏密表示高低,这个方法在黑白印刷的老文献里很常见,效果非常稳。
我自己最常用的是“灰度 colormap + 等值线 + 关键点标注”这套组合,改完之后图在黑白下反而比原来彩色版更清楚,因为读者不用再去对照色标猜数值。
4.4 照片和渲染类结果图:层次比清晰度更值钱
这类图转灰度之后最常见的问题是“整体发灰、没有对比”,原因是原图是彩色的,转灰度后三个通道的信息被压成一个,明暗范围缩小了。处理办法是先转灰度,再看灰度直方图,如果数据集中在中间一段(比如 80–170),就做一次色阶拉伸,把黑场拉到 20 左右、白场拉到 235 左右,注意留一点点余量,别拉到纯黑纯白,否则高光和暗部细节全丢。
还有一条:如果原图里的关键信息是靠颜色区分的(比如用红色标出病变区域、用绿色标出分割结果),转灰度之后标记会消失。这种情况必须改成用轮廓线、箭头、或明暗差异来标注,不能指望颜色。
5. 出图工具链的具体参数
理论说完,落到工具上。这一节给的参数都是我在实际项目里跑通的,可以直接抄。
5.1 MATLAB:搞清楚 print 和 exportgraphics 的差别
老代码里常见print(gcf,'-dpng','-r600','fig1.png'),这个函数能用,但它对矢量输出的支持一般。较新版本里我更推荐exportgraphics,它能把图的边距自动收紧,也不会把整个窗口的白边都导出去:
figure('Units','centimeters','Position',[2 2 8.5 6.5]); % 按最终版面宽度设画布 plot(x1,y1,'k-','LineWidth',0.75); hold on; plot(x2,y2,'k--','LineWidth',0.75); plot(x3,y3,'k-.','LineWidth',0.75); set(gca,'Color','w','FontSize',8,'FontName','Arial','LineWidth',0.5,... 'GridLineStyle',':','XColor',[0 0 0],'YColor',[0 0 0]); colormap(gray); % 有图像或热力图时用这个 exportgraphics(gcf,'fig1.tif','Resolution',600,'BackgroundColor','white');几个细节值得说。Position里的单位设成厘米、宽度设成 8.5 cm,是假设这张图排单栏,如果排通栏就改成 17 cm。'Color','w'是把坐标区背景强制设成白色,不然默认是浅灰,转灰度后整块图会发灰。'XColor'和'YColor'设成纯黑,避免用默认的深灰导致印刷后刻度字发虚。热力图场合下colormap(gray)是关键的一行,很多人在这里用默认 colormap,后面就出问题。
5.2 Python 的 matplotlib:按物理尺寸出图是关键
import matplotlib.pyplot as plt plt.rcParams.update({ "font.size": 8, "font.family": "serif", "axes.linewidth": 0.6, "lines.linewidth": 0.9, "legend.frameon": False, "savefig.facecolor": "white", }) fig, ax = plt.subplots(figsize=(3.35, 2.6)) # 单位英寸,3.35 in ≈ 85 mm ax.plot(x1, y1, color="black", linestyle="-", marker="o", markersize=3.5, markevery=5) ax.plot(x2, y2, color="0.35", linestyle="--", marker="s", markersize=3.5, markevery=5) ax.plot(x3, y3, color="0.60", linestyle="-.", marker="^", markersize=3.5, markevery=5) ax.grid(True, linestyle=":", linewidth=0.4, color="0.75") fig.tight_layout() fig.savefig("fig1.tif", dpi=600, bbox_inches="tight", pil_kwargs={"compression": "tiff_lzw"})figsize用英寸是因为 matplotlib 的内部单位就是英寸,3.35 英寸约等于 85 mm 单栏宽度。markevery=5控制标记稀疏度,这是折线图黑白化最实用的一行。color="0.35"是直接给灰度值,比给 RGB 再转更可控。pil_kwargs里指定 LZW 压缩,能在不损失质量的前提下把文件压到合适大小。热力图场合把cmap="gray"加上,并加一句plt.colorbar(),色标本身也得是灰度的。
5.3 Origin:曲线样式和导出设置两步走
曲线的线型和图案在“Plot Details”对话框里改,“Line”页改线型线宽,“Symbol”页改标记,柱状图在“Pattern”页把填充色设为白色、边框设为黑色、图案选斜线并设间距。导出时选“Export Graphs”,格式选 TIFF,Color Depth 一定要选 Gray Scale 而不是 Color,分辨率设 600。这一步很多人忘了改,导出的文件属性里还是 RGB。
Origin 还有个容易出问题的地方:默认字体是 Arial 8 pt,但坐标轴标题默认会大一号,如果在版面上被缩小过,就会变成一半大小。建议所有文字统一设成 8 pt,标题和刻度不要分级。
5.4 Word、Visio、Excel:矢量图和“不要压缩图片”
Visio 画的框图是矢量的,最佳输出方式是导出 PDF 或 EMF 再插入,不要截图。Word 里嵌图有两个隐藏问题:一是默认开启了图片压缩,插进去的高分辨率图会被自动降采样;二是复制粘贴的图表其实是链接对象,打印时可能变成低分辨率位图。第一个问题要在“文件—选项—高级”里找到图像大小和质量那一栏,勾选“不压缩文件中的图像”,并把默认分辨率设成高保真;第二个问题就老老实实用“插入—图片”,不要用粘贴。
Excel 生成的图表默认配色和默认字体在黑白下基本没法看。改法是把每个系列的填充改成白底加不同图案、边框改黑、字体改 8 pt、网格线删掉,然后用“另存为 PDF”输出。我不建议把 Excel 图直接截图,哪怕是高分辨率截图,因为字体渲染会带抗锯齿灰边,印刷时显得脏。
6. 交稿前的灰度自检流程
改完图不等于过关。我交稿前固定走一遍自检流程,大概十分钟,能省掉一轮退修。
6.1 先用直方图和取色器做数值检查
把图在图像处理软件里打开,看灰度直方图。如果数据全部挤在中间三分之一,说明对比度不足,印刷出来会是一张雾蒙蒙的图;如果两端都有明显堆积,说明有纯黑或纯白区域,要检查是不是把细节压掉了。再用取色器点一下各数据系列,读出实际灰度值,两两之差小于 20% 就要回去重新调。
顺便检查一下有没有残留的彩色像素,尤其是在抗锯齿边缘和半透明填充处,这类像素肉眼几乎看不出来,但投稿系统能检测到。
6.2 按最终版面尺寸打样,别在屏幕上判断
屏幕是发光的,印刷是反光的,两者观感差很多。我的做法是:新建一个文档,把页面设成期刊的版心宽度,把图插进去缩放到实际尺寸,然后用黑白激光打印机打在普通 A4 纸上。拿到纸上看三件事:图里的字能不能看清、相邻的曲线能不能分开、浅灰的部分有没有糊成一片。
这一步我强烈建议做,因为它能发现所有屏幕上看不出来的问题。我有一次就是因为没打样,交上去的图里 60% 灰的虚线和 75% 灰的点线在纸上几乎一样,被编辑退回来重做。
6.3 文件层面的检查清单
| 检查项 | 合格标准 | 常见错误 |
|---|---|---|
| 图像模式 | 灰度(单通道) | RGB 三通道,看着灰其实是彩色 |
| 分辨率 | 线条图 ≥600 dpi,灰度图 ≥300 dpi | 只看到文件属性写 300,没按版面尺寸核算 |
| 文件格式 | TIFF(LZW)、EPS、PDF | JPEG、屏幕截图 PNG、BMP |
| 字号 | 最终印刷 ≥6 pt,建议 7–8 pt | 图上字很小,靠放大才能看清 |
| 线宽 | ≥0.25 mm | 细线印刷后断续 |
| 背景 | 纯白,无浅灰底 | 坐标区默认浅灰底 |
| 字体 | 嵌入或转曲 | 矢量文件用了系统缺失字体,打开变方框 |
| 图注 | 放在正文,不嵌在图里 | 图注做进图片,排版时重复 |
| 文件命名 | fig1.tif、图1.tif 之类,一图一文件 | 所有图塞在一个 Word 里 |
表格里最后一条值得展开说。不少期刊要求图片单独打包提交,一图一个文件,文件名和正文中的图号对应。如果全部塞在 Word 里交上去,排版时要么被压缩、要么被重新裁切,最后出来的效果完全不受控。我一般的做法是正文里放一份低分辨率预览版方便审稿人阅读,另外单独打包一份高分辨率原图,两套都准备好。
7. 被退修的常见意见与逐条应对
改图这些年,收到的和帮别人看过的退修意见,翻来覆去就那么几条。把它们列出来,比事后猜要高效得多。
“图片分辨率不足”——八成是从网页或软件界面截的图。解决办法只有重画或重新导出,用插值放大的方式补救没有意义,插值只会让边缘更糊。
“图中文字过小,请调整”——不是让你把字号改大,而是要在出图时按最终物理尺寸设字号。把画布从 20 cm 缩到 8.5 cm 再设 8 pt,和直接在 8.5 cm 画布上设 8 pt,效果一样,但如果先设 20 cm 画布、8 pt 字、再缩到 8.5 cm,字号就只剩 3.4 pt 了。
“图中曲线无法区分”——这是黑白化之后的典型问题,回到第 4 节,加线型、加标记、拉灰度差。
“图片为彩色,请改为黑白”——除了转灰度,还要检查文件模式。有些软件导出时勾了“灰度”但保留了 alpha 通道,系统仍然判成彩色。
“图例与图重复,请精简”——黑白图里图例占的地方更值钱,能直接标注就删图例。
“坐标轴刻度线过密”——这个在缩小的图上特别明显。主刻度保留,次刻度删掉,或者改成向内的小刻度。
“图中含有中文(英文期刊)”或者“图中字体不统一”——统一成一种字体,中文用宋体或黑体,英文用 Times 或 Arial,全图一致。
我个人在实际操作中的体会是,黑白图这件事最大的成本不在技术,而在意识。你只要在画第一张图的时候就假设它最终会被印成黑白,后面所有的坑都不会踩。真正麻烦的都是画完了、数据也跑完了,再回头去改配色、改线型、改字号,改一张图的耐心消耗抵得上重画三张。所以后来我干脆在绘图模板里把灰度配色、线型序列、标记序列、8 pt 字号、白底、无色图例这些全部预设好,新项目直接套模板,出图即是黑白,一次都不用返工。这个模板我建议每个经常投稿的人都准备一份,哪怕只是几行 rcParams 配置,长期看省下来的时间相当可观。