• R语言实操记录——导出高清图片(矢量图)


    R语言

    R语言实操记录——导出高清图片(矢量图



    一、起因(闲聊,可跳过)

    最近需要用到环状图,照着说明书浅学了一下circlize包(网上的教程几乎全是机翻后的说明书内容,远不如直接看说明书,然说明书又太长,后续补一份文章,讲一下我自己的理解思路,方便后续生疏后可以快速上手),在成图的时候发现图片质量很差,就连坐标轴都是歪的。例如下图。
    在这里插入图片描述
    附上代码:

    circlize_plot = function() {
      set.seed(12345)
      sectors = letters[1:10]
      circos.initialize(sectors, xlim = c(0, 1))
      circos.track(ylim = c(0, 1), panel.fun = function(x, y) {
        circos.points(runif(20), runif(20), cex = 0.5, pch = 16, col = 2)
        circos.points(runif(20), runif(20), cex = 0.5, pch = 16, col = 3)
        circos.axis(labels.cex = 0.6)
      })
      circos.track(ylim = c(0, 1), panel.fun = function(x, y) {
        circos.lines(sort(runif(20)), runif(20), col = 4)
        circos.lines(sort(runif(20)), runif(20), col = 5)
      })
      
      for(i in 1:10) {
        circos.link(sample(sectors, 1), sort(runif(10))[1:2], 
                    sample(sectors, 1), sort(runif(10))[1:2],
                    col = add_transparency(col_fun(rnorm(1))))
      }
      circos.clear()
    }
    circlize_plot()
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22

    保存方法

    png("circliz.png")
    circlize_plot() #绘制图片的代码,放在pdf和dev.off中间
    dev.off()
    
    • 1
    • 2
    • 3

    我师兄的第一反应都是让我换软件了,哈哈。但作为一个出了这么多年的软件不应该有这样的问题,我思考了一下,可能有下面几个原因。

    • 1、circlize包中可能有我未知的绘图前的需要设置的参数。
    • 2、受限于Rstudio本身的原因,图片无法展示高清细节,需要下载为高像素的图片。
      针对第一个猜测,我发现说明书中没有特别提及相关参数,为了排除代码问题,我找了一个说明书中的示例代码,跑了一遍,与说明书中的高清图片不同,我仍然得到了低质量图片,所以排除这个猜测。下图为说明书中的图片。

    在这里插入图片描述

    针对第二个猜测,我去网上查询了一下,果然遇到相同问题的人不少啊。

    二、如何在R中导出高清图片(矢量图)

    2.1、保存为EPS图片格式后转AI编辑

    • 1、把自己的图片保存成EPS格式

      • Encapsulated Post Script (eps),是一种被封装后的文件。主要由Ai软件生成的。PS和AI均可以打开,只不过用PS打开时会将eps文件进行栅格化(像素会变到300dpi,会变糊,所以建议用AI打开)。
        在这里插入图片描述
        在这里插入图片描述
    • 2、得到保存的EPS图片,用Adobe Illustrator (AI)打开
      在这里插入图片描述

    • 3、在AI中可以编辑,保存成自己想要的格式
      在这里插入图片描述

    2.2、保存为PDF格式(推荐)

    • 直接导出为PDF格式,也可以得到导出pdf的矢量图,后续想要编辑,还是转到AI中打开。
    pdf("circliz.pdf")
    circlize_plot() #绘制图片的代码,放在pdf和dev.off中间
    dev.off()
    
    • 1
    • 2
    • 3

    在这里插入图片描述

    2.3、用ggplot2包的ggsave函数输出图片(SVG格式)

    • 相较于base中提供的保存图片函数,ggsave函数的功能更强,可以设置长宽和分辨率(dpi)大小及保存的格式等,自然可以获得高清图片。可惜的是并非所有函数生成的图片都适用于ggsave函数保存(例如circlize包绘制的图形就不行)。
    • 可缩放矢量图形(Scalable Vector Graphics,SVG)基于 XML 标记语言,用于描述二维的矢量图形
    library(ggplot2)
    ggsave(filename = “filename.svg”, polt, width=  ,height=  ,dpi= )
    
    • 1
    • 2

    三、矢量图与位图

    • 其实最开始我获得的图片是位图(Bitmap),由一个个像素点构成,所以放大后才看起来不连贯。后续获得的高清图片则是矢量图(Vector),也称为面向对象的图像或绘图图像,在数学上定义为一系列由点连接的线。由于图像是由数学公式描述的,可以根据需要重新生成,所以矢量图可以进行无损缩放

    • 位图和矢量图是两种常见的图像表示方法,它们有一些明显的区别。下面是位图和矢量图之间的主要区别:

      • 定义方式:
        • 位图:由像素(Pixel)组成的网格,每个像素都有自己的颜色值。图像被分成许多小的方块,每个方块称为像素。
        • 矢量图:使用数学公式描述图像,通过定义线段、曲线、形状等来创建图像。
      • 缩放性:
        • 位图:在缩放时,位图会失去一定的精度。当放大位图时,边缘变得锯齿状,而缩小位图时,细节可能会丢失。
        • 矢量图:矢量图可以无损地进行缩放,因为图像是由数学公式描述的,可以根据需要重新生成。
      • 文件大小:
        • 位图:文件大小取决于像素的数量和颜色深度。由于每个像素都需要存储颜色信息,位图文件通常比较大。
        • 矢量图:矢量图文件通常相对较小,因为它们仅存储对象的描述和属性,而不存储每个像素的颜色信息。
      • 分辨率:
        • 位图:位图具有特定的分辨率,表示为每英寸的像素数(DPI)。更高的分辨率可以提供更多的细节和更清晰的图像。
        • 矢量图:矢量图没有固定的分辨率,它们可以无损地缩放到任意分辨率。
      • 编辑灵活性:
        • 位图:位图通常是平面图像,难以修改或编辑。对位图进行编辑时,需要对每个像素进行处理。
        • 矢量图:由于矢量图使用数学公式来定义图像,因此可以轻松地修改、调整和编辑各个元素。
      • 应用领域:
        • 位图:位图常用于表达照片、实际场景和复杂的图像,如数字照片、位图图标等。
        • 矢量图:矢量图常用于需要无损缩放和编辑的图像,如图标、徽标、插图等。
          综上所述,位图适用于表达真实场景和细节丰富的图像,而矢量图适用于需要无损缩放和编辑的图像。选择使用哪种图像格式取决于具体的应用需求和使用场景。
  • 相关阅读:
    音频怎么转文字?学会这3招,轻松拉满你的工作效率
    设计模式——模板方法
    Java数据结构与Java算法学习Day03---线性表(简略笔记记录)
    猿创征文|【Maven】分模块开发、依赖管理、聚合、继承、属性
    【Node.js从基础到高级运用】二、搭建开发环境
    ArcGIS中如何为跨带数据投影?
    嵌入式Linux驱动开发3---内核配置 Kconfig以及.config
    UML类图画法全程解析
    shiro550复现环境搭建
    VSCode任务tasks.json中的问题匹配器problemMatcher和ProblemPattern的severity属性关系
  • 原文地址:https://blog.csdn.net/qq_45794091/article/details/134246679