科研论文黑白图制作:灰度转换、分辨率与投稿自检
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部分期刊要求 600TIFFLZW 无损压缩不要用 JPEG组合图照片上叠线条、标注、箭头不低于 600 dpiTIFF 或 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 mm170 ÷ 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, colorblack, linestyle-, markero, markersize3.5, markevery5) ax.plot(x2, y2, color0.35, linestyle--, markers, markersize3.5, markevery5) ax.plot(x3, y3, color0.60, linestyle-., marker^, markersize3.5, markevery5) ax.grid(True, linestyle:, linewidth0.4, color0.75) fig.tight_layout() fig.savefig(fig1.tif, dpi600, bbox_inchestight, pil_kwargs{compression: tiff_lzw})figsize用英寸是因为 matplotlib 的内部单位就是英寸3.35 英寸约等于 85 mm 单栏宽度。markevery5控制标记稀疏度这是折线图黑白化最实用的一行。color0.35是直接给灰度值比给 RGB 再转更可控。pil_kwargs里指定 LZW 压缩能在不损失质量的前提下把文件压到合适大小。热力图场合把cmapgray加上并加一句plt.colorbar()色标本身也得是灰度的。5.3 Origin曲线样式和导出设置两步走曲线的线型和图案在“Plot Details”对话框里改“Line”页改线型线宽“Symbol”页改标记柱状图在“Pattern”页把填充色设为白色、边框设为黑色、图案选斜线并设间距。导出时选“Export Graphs”格式选 TIFFColor 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没按版面尺寸核算文件格式TIFFLZW、EPS、PDFJPEG、屏幕截图 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 配置长期看省下来的时间相当可观。