科研绘图知识

格式:位图和矢量图

  1. 图片类型:
    1. 位图(raster image). 位图是用不同色块的像素来表示图像,其特点是放大后会变模糊。一般使用Adobe Photoshop软件对位图进行编辑。
    2. 矢量图(vector image). 矢量图是用数学公式来表示图像,其特点是放大后图片依然很清晰。一般使用Adobe Illustrator软件(收费)对矢量图进行编辑。建议使用Inkscape!
  2. 位图和矢量图之间可以进行转换,该转换具有半不可逆性,即矢量图转换成位图可以有很好的效果和很高的清晰度,但位图转矢量图的效果和清晰度不太好。
  3. 位图常用的扩展名有:.jpg .tif .png .bmp .gif .psd等。
    矢量图常用的扩展名有:.eps .emf .wmf .svg .ai .pdf等。
    但是,并不受所有的格式都被科研杂志所接受。Journal publishers have reached an industry consensus on how image files should be formatted for academic journals. As a few examples, Cambridge, Elsevier, Oxford, SAGE, Taylor and Francis, and Wiley agree that all image files should be in one of three formats: TIFF (Tagged Image File Format), EPS (Encapsulated PostScript), or PDF (Portable Document Format). See Making High-Resolution Graphics for Academic Publishing for more details. 最后注意,由于pdf和eps都是矢量图格式,不需要设定分辨率,长度和宽度。TIF则必须要设置分辨率,长度和宽度以达到最优的分辨率。而且TIF高分辨率的文件一般很大,需要进行压缩,一般推荐使用LZW方法。

图片尺寸(size)

  • 按照实际大小。Figures of one column must be between 2 and 3.25 inches wide (5 to 8.45 cm). Two-column figures must be between 4.25 and 6.875 inches wide (10.6 to 17.5 cm). The height of figures should not exceed the top and bottom margins.
  • 参考 Artwork - sizing

期刊对图片宽度的一般要求

位图分辨率(resolution)

对于位图,还可以用像素数目或分辨率(以Pixel或者dpi计算)来表示图片的大小。注意像素数目和分辨率是针对位图而言的,矢量图一般不谈像素数目和分辨率。具体而言,位图图片(raster image)按照出版要求,可以分为三类,每种类别科研论文所要求的出版分辨率不一样。

  1. 黑白图片(Monochrome images, e.g. line-art): 没有中间颜色的黑白图片。分辨率一般要求1200以上。例如纯线形图或没有填充的条形图。
  2. 组合半色调图片(Combination Halftones): 包含字体标记或者线条的彩色或灰度图片(color or grayscale figures). 分辨率(DPI/PPI)至少600以上。包含字体和线条
  3. 半色调(Halftones): 不包含字体和线条的彩色或灰度图片。分辨率至少300. 不包含字体和线条

色彩 COLOR IN SCIENTIFIC FIGURES

  1. 色彩的模式(color mode):
    1. in RGB for online
    2. in CMYK for print.
      RGB (Red, Green, Blue) and CMYK (Cyan, Magenta, Yellow, Black) refer to the color space of your figures. Journals will ask for a specific color space depending on if your paper will be published online or in print. RGB is typically used when publishing online because computer monitors display light as a combination of red, green, and blue. In contrast, printers use cyan, magenta, yellow, and black to deposit color onto a printed page. COLOR IN SCIENTIFIC FIGURES
  2. 如何选择绘图的色彩?:
    1. 对于具有方向性(增加或减少)的量化数据,如体重,人口,使用亮度(brightness)或色调(hue)累加的调色条(ramp)。因为一般而言,人们倾向于把“更重”的颜色解释为“更多”。 Sequential palettes from Color Brewer
    2. 对于没有方向性的离散数据,数据正负皆有(例如大脑激活,既有正激活,也有负激活)。那么使用亮度或色调对立的调色条。These often have the darker colours at each end, representing “more negative” and “more positive”.
    3. 对于分类数据(categorical data),要使用分界分明,没有明显过度的色彩。如,红蓝黑。注意,不同颜色之间可以加重亮度以加强区分度。
    4. 注意颜色的可读性(Accessibility)。务必避免同时使用红色和绿色,因为红绿色盲的人群无法分辨这两种颜色。

其他要求

  1. 字体(font):
    1. type: 普遍字符使用serif 字体 (如Arial, Helvetica or Futura). 希腊字母如a,b,g等则使用Symbol字体。See What Font Should I Use? for more details.
    2. size: APA要求最小8点,最大14点。最佳范围是10 到 12 point,最大字体和最小字体之间的差不可大于4点。
  2. 边(Margins):Set document margins to 1 inch all around (top, bottom, left, right).
  3. 注解(Annotation):注解是额外补充的数据。例如,条件或组别之间差异是否显著的线和符合。显著线可以分解成三条线段。
  4. 各个元素之间的对比。例如,线形图的曲线和条形图的条状轮廓,应该比轴标签(axis lables)更显著;轴标签应该比标记符号(legend labels)更显著。
  5. 对齐(Alignment)。要学会使用网格线,保证元素或者图片之间的规整。

科研论文中的图片分类

按照信息来源可以分为三类:实验图、数据图和示意图

  • 实验图。例如实验的流程图(procedure),建议使用PPT或Inkscape来编辑;
  • 数据图。常见的统计图形都属于数据图。统计图是用图形将统计数据可视化(visualization),利用线条高低、面积大小代表数量,通俗易懂,比文本与统计表更便于理解和比较。统计图种类较多,常用的包括直条图、百分直条图、直方图、线图和点图等。在科技论文中,应根据资料的类型及表达目的选用合适的统计图。
  • 示意图。例如大脑的解剖图,ROI的定位图。

图的组成成分(The Anatomy of a Figure)

  1. 轴线(Axis lines): X (horizontal) and Y (vertical) lines
  2. 坐标系统(coordinates),包括原点(origin),单位(Unit)和刻度(Kicks)
  3. 轴标(Axis lables): X and Y lables
  4. 标题(Title)
  5. 误差棒(error bar)
  6. 图例(legend). 对于图片呈现内容的概述。

ggplot2 绘图笔记

The ggplot2 book http://had.co.nz/ggplot2

ggplot2 demo

ggplot2 notes

绘图基础

ggplot 绘图原理

  • 图层(layer)分离,一句语句代表一张图层,不同图层之间可以通过+号叠加(信息自由组合)。
  • 每一个图层包括以下四大组成部分:
    • 位置调整方式:怎么放?X轴放啥,Y轴放啥?
    • 数据和图形属性映射。例如把气温测量值对应的变量映射为颜色。
    • 统计变换(stat):是否对原始数据进行统计变换。默认stat是identity,即不做任何统计变换。
    • 几何对象(geom):呈现为啥形状?点,线,面(条/饼)?点和线不要填充(fill),而面需要填充。

ggplot 基本函数: 数据映射-绘制图层-调整属性

  1. 从数据到图形结构的桥梁: 映射函数aes(). 所谓的映射即为数据集中的数据关联到相应的图形属性过程中一种对应关系. 例如, mapping=aes(x=val1,y=val2, fill=val3), 指定变量1对应x, 变量2对应val2, 填充变量对应val3.
  2. 绘制图形图层: geom_xxx函数.geom是geometry(几何)的简称, 顾名思义, geom_xxx函数一类的函数负责把aes中指定的数据绘制为特定的图形, 如散点图和柱状图. 以绘制柱状图为例, 代码为p1=p1+geom_bar(position = “dodge”, stat=”identity”)
    • position指定图形的排列方式, dodge为并列, stack为堆叠.
    • stat一般默认为stat_identity则表示不做任何的统计变换
  3. 调整已经绘制完图形的属性: scale_xxx函数, 大体分为以下几类
    1. 颜色:包括 color(颜色或边框颜色)、fill(填充颜色)和 alpha(透明度)
    2. 形状:包括 linetype(线型)、size(点的大小或线的宽度)和 shape(形状)
    3. 位置:主要就是坐标系统(Coordinate), 包括 x, y, xmin, xmax, ymin, ymax, xend, yend

ggplot symbol- points

ggplot symbol- linetype

  1. 位面(Facet):很多时候需要将数据按某种方法分组,分别进行图(分面)。位面就是控制分组绘图的方法和排列形式。
  2. 主题(theme)

绘图前的准备

  1. 数据整理:
    1. 合并多个数据集,或者增添一个数据集中删除变量;
    2. 同一个数据集的变形。变长(long)或变短(short)。
      使用tidyr包:(gather(宽数据转为长数据)、spread(长数据转为宽数据)、unit(多列合并为一列)、separate(将一列分离为多列))
    3. 变量命名. 尤其注意, 分类变量务必要修改为字符串变量类型, 不要用数字来表达. 例如分组变量, 不要用1234阿拉伯数字表示, 可以用Group1, Group2来表示
  2. 描述统计, 例如得出每个实验条件的均值和标准误. 一般使用dplyr/tidyr包整理数据, 具体步骤如下:
    1. 使用gather()函数实现宽表转长表,语法如下: gather(data, key, value, …, na.rm = FALSE, convert = FALSE)
      • data:需要被转换的宽形表
      • key:定义新列的名称-将原数据框中的所有列赋给一个新变量key
      • value:定义新列的值-将原数据框中的所有值赋给一个新变量value
      • …:可以指定哪些列聚到同一列中。例如“-A”表示除了A列,其他都整合到新列,“a:b”则表示,将a到b之间的列整合到新列,其他列不整合。
      • na.rm:是否删除缺失值
    2. 教程
    3. Data Processing with dplyr & tidyr
    4. group_by结合summarise是很常用的用法:
       data_long %>%
       group_by(group,measure) %>%
       summarise(
         means1 = mean(value, na.rm = TRUE),
         se1 = sd(value, na.rm = TRUE)/sqrt(n()) # 标准误值(SE)= 标准差SD/√n, n是样本量。
       ) %>%
       mutate(a1 = means1 -se1, b1 = means1 + se1) -> data_stat
      

开始绘图

  1. 画出基础图层:p <- ggplot(data, aes(x, y)) :
    • 参数data指定传入数据;
    • aes 即 aesthetics,设定图形属性的映射关系。如,向x传入横坐标变量名,向y传入纵坐标变量名。
    • 注意,此时画出的是一个空白框图,数据图层还没有绘制;
  2. 画出数据图层,并指定每个图层的图形属性映射:
    1. geom_point(),散点图;
    2. geom_line(),折线图。线的类型(实线虚线)可以用个linetpye进行设定,既可以指定一个变量进行自动区分,也可以设置具体的参数如solid, dashed, dotted等。
    3. geom_bar(),条形图
    4. geom_area(),饼图(面积图)
    5. geom_density(),概率密度函数图;
    6. geom_polygon()绘制多边形 注意,一个命令生成一个对应的图层,不同的图像图层可以相互叠加。
  3. 添加线条(line)的方法:
    1. stat_smooth(color=’blue’),添加趋势线;
    2. geom_abline(intercept, slope, color, size),添加斜线,intercept确定截距,slope确定斜率,效果类似于stat_smooth();
    3. geom_hline(yintercept, color, size),添加水平线,yintercept确定水平线的位置,color确定颜色,size确定线条宽度;
    4. geom_vline(xintercept, color, size),添加垂线;
    5. geom_line,geom_path,geom_segment:可以添加直线
  4. 位置调整(Position adjustments)是针对同一图层内元素的位置进行微调的方法。它包括五种设置,分别是stack、dodge、fill、identity、jitter。dodge方式是将不同类型的数据并列放置(左右);stack方式是将不同类型数据堆叠放置(上下),这也是geom_bar的默认处理方式;fill方式和stack一样是上下排列,但而是以百分比显示不同数据;identity方式是不做任何改变直接显示出来,所以需要设置透明度才能看得清楚。
  5. 微调图形。这一类函数不是绘制图层,而是对图层内的元素进行调整。
    • scale_:直译为标尺,这就是与aes内的各种美学(shape、color、fill、alpha)调整有关的函数。
    • guides:调整所有的text。
    • coord_:调整坐标。
    • theme:调整不与数据有关的图的元素的函数。
  6. 主题设置:
    1. Default themes:theme_bw(black and white主题),theme_grey (灰色主题).
    2. Custom themes: install.packages("ggthemes") # Install library(ggthemes) # Load

图形的分组和分面

分组

  • 在ggplot中我们大概可以把几何对象分为2种:
    1. 个体几何对象:绘制的图像中的每一个点对应数据框中的每一个观测值,如geom_point
    2. 群组几何对象:绘制的图像中的每一个对象,对应数据框中多个观测值的统计结果,如geom_boxplot(用于绘制箱线图)
  • 所以在使用类似于geom_boxplot这一类群组几何对象时,需要进行分组,ggplot默认以离散型变量分组。分组变量必须是因子变量。
  • 分组可能是同一张图内分组,也可以是不同的图对应不同的组(参考下面的分面)。

分面(facet)

  • 我们有时需要按不同的变量进行分组,同时绘制多个图形。例如,我们如果想要以Group(男女)分组,分别绘制男性和女性的体重,实现一页多图的效果,如何实现呢?这就要涉及到ggplot中的另一个非常重要的概念:分面
  • ggplot中实现分面有两个函数:网格分面facet_grid()和封装分面facet_wrap(). 其中都含有两种分面属性:指定分面,分面标度。参考教程
  • ggplot2 的分面可以绘制一页多图, 但是必须是来自同一个数据集的图形, 局限性很大。如果我们有多个不同来源的图形,想绘制到一张图上又该如何处理呢? 可以使用Rmisc包的multiplot函数(不推荐)或者gridExtra包里的grid.arrange()函数。参考教程
  • 注意,虽然multiplot和grid.arrange都可以实现分面,但是multiplot与ggplot2自带的ggsave兼容性不好,而后者可以直接使用ggsave保存。grid.arrange教程
  • ggpubr包的优点是,ggarrange函数可以在组图的同时给不同的分页添加标签,非常方便,缺点就是不像grid.arrange有layout_matrix这个参数,不能设置比较复杂的排版。
  • 所以,最好的方案是:简单的组图用ggarrange搞定;复杂组图先用ggarrange对各行单独进行组图,然后再用grid.arrange的layout_matrix参数根据需要进行排版设置。这样既可以自由的添加标签,也能实现复杂的排版。

专题

  1. 利用ggsignif绘制误差棒及显著性标记 利用ggpubr绘制显著性标记
  2. 绘制交互作用
  3. python中的绘图包ggplot用法总结
  4. 处理散点图中的重合overlappping问题

Packages or Functions needed

  1. 字体导入:extrafont
  2. 配色:ggsci,主题ggthemr
  3. 组合分页:
    1. gridExtra: grid.arrange(p1, p2, ncol = 2)
    2. Rmisc: multiplot(…, plotlist = NULL, cols = 1, layout = NULL)
  4. 导出函数:ggsave。注意分辨率的设置。

pdf to tif

  1. Install GhostScript
  2. Install ImageMagick
  3. Create “Convert-to-TIFF.bat” (Windows) and use the following line: for %%f in (%*) DO "C:\Program Files\ImageMagick-7.0.7-Q16\convert.exe" -density 600 -compress lzw %%f %%f.tiff Dragging any number of single-page PDF files onto this file will convert them to compressed TIFFs, at 600 DPI.

论文模型图

论文模型图

References

  • https://egret.psychol.cam.ac.uk/statistics/R/graphs2.html
  • https://egret.psychol.cam.ac.uk/statistics/R/index.html
  • R 语言 https://www.jianshu.com/p/8efb00ba0387
  • 史上最全的论文图表基本规范 https://mp.weixin.qq.com/s/SvF0iNd6QVrlxJXDKC3Rxw
  • 散点图 http://www.ppvke.com/Blog/archives/28549
  • ggplot2中文教程 https://www.cnblogs.com/nxld/p/6059603.html
  • pdf2tif https://stackoverflow.com/questions/75500/best-way-to-convert-pdf-files-to-tiff-files
  • ImageMagick入门 https://www.jianshu.com/p/310d833d9a25
  • 如何用ggplot2绘制漂亮的统计图形