从R中以矢量格式导出图像,文本和绘图分层分开?

3
我该如何在R中以矢量格式导出图像,并将文本标签和实际绘图分开成为不同的层?
我提出这个问题是因为我正在准备一篇文章发表,编辑要求我提供高质量的矢量格式版本的图像(.ai、.eps、.psd)。他们还指出,文本和标签应该分别位于不同的层中,以便在制作过程中进行编辑。
我使用ggplot2创建了我的绘图,并成功将它们导出为矢量格式(由于EPS半透明着色不易显示,所以我选择了SVG格式)。我可以使用ggsave("filename.svg")或者在添加额外文本的情况下使用svg("filename.svg")和dev.off()。我之所以不在此处使用facets是因为在实际绘图中,我会为单个面板添加显著性水平。
library(ggplot2); library(cowplot); library(svglite)

data_set = structure(list(Target = c("Snodgrassella", "Snodgrassella", "ABPV", 
                                     "ABPV", "DWV", "DWV", "SBPV", "SBPV", "AmFV", "AmFV", "Gilliamella", 
                                     "Gilliamella"), Legend = structure(c(1L, 2L, 1L, 2L, 1L, 2L, 
                                                                          1L, 2L, 1L, 2L, 1L, 2L), .Label = c("A", "B"), class = "factor"), 
                          Estimate = c(69.6983166741774, 93.5474567104972, 12.5, 3.125, 
                                       0, 0, 6.25, 12.5, 0, 0, 90.625, 90.625), Nucleotide = structure(c(2L, 
                                                                                                         2L, 1L, 1L, 1L, 1L, 1L, 1L, 2L, 2L, 2L, 2L), .Label = c("RNA", 
                                                                                                                                                                 "DNA"), class = "factor")), row.names = c(7L, 8L, 9L, 10L, 
                                                                                                                                                                                                           15L, 16L, 21L, 22L, 23L, 24L, 31L, 32L), class = "data.frame")
RNA_data_set = subset(data_set, Nucleotide == "RNA")
DNA_data_set = subset(data_set, Nucleotide == "DNA")

RNA_plot <- ggplot(RNA_data_set, aes(x=Target, y=Estimate, fill = Legend))+
  geom_bar(stat="identity", color = "black")+
  xlab(NULL) +
  theme(legend.position="none",
        plot.margin = unit(x = c(0.25,0.25,0.25,1),"cm"))+
  ylab("RNA")

DNA_plot <- ggplot(DNA_data_set, aes(x=Target, y=Estimate, fill = Legend))+
  geom_bar(stat="identity", color = "black")+
  xlab(NULL) +
  theme(legend.position="none",
        plot.margin = unit(x = c(0.25,0.25,0.25,1),"cm"))+
  ylab("RNA")

svg("filename.svg")
plot_grid(RNA_plot, DNA_plot, nrow = 2)
grid.text(unit(0.03,"npc"),0.5, label = "Y-label (%)", rot = 90)
dev.off()

然而,我不知道如何在不同的图层中将文本/标签与实际绘图分离。 有人知道如何做到这一点吗?


1
这很可能是你需要在后处理步骤中使用其他软件完成的事情。R中的绘图函数实际上不允许进行层控制,因为对于栅格输出来说这是没有意义的。 - MrFlick
1
可能更容易生成PDF输出,因为它仍然是矢量图,并且文本实际上是文本(在SVG中只是形状)。但不知道如何在保留区别的同时进行转换。 - JBGruber
1个回答

6

据我所知,ggplot不允许您从同一图中导出不同的图层,因此这里有一个相当简单的解决方法。修改您的绘图代码,使其生成两个图:一个仅显示轴和数据,另一个仅显示文本/标签。在每个图中,您保留了所有元素(以便项目的放置位置保持不变),但使用主题编辑使您不想看到的元素透明。

以下是如何修改您的RNA图以获得仅包含数据的一个图和仅包含文本/标签的第二个图的方法。

 RNA_plot_data <- ggplot(RNA_data_set, aes(x=Target, y=Estimate, fill = Legend))+
  geom_bar(stat="identity", color = "black")+
  xlab(NULL) +
  theme(legend.position = "none",
        text = element_text(color = "transparent"), #transparent text
        axis.text = element_text(color = "transparent"),
        plot.margin = unit(x = c(0.25,0.25,0.25,1),"cm"))+
  ylab("RNA")
RNA_plot_data

RNA_plot_text <- ggplot(RNA_data_set, aes(x=Target, y=Estimate, fill = Legend))+
  geom_bar(stat = "identity", alpha = 0) + #make data transparent
  xlab(NULL) +
  theme(legend.position="none",
        axis.line = element_blank(), #remove axes
        axis.ticks = element_blank(),
        #make all rectangles (plot and panel background) transparent
        rect = element_rect(fill = "transparent", colour = NA),
        plot.margin = unit(x = c(0.25,0.25,0.25,1),"cm"))+
  ylab("RNA")
RNA_plot_text

只要您使用支持透明度的文件格式保存这些图表,您就会拥有您的绘图层和文本/标签层。
仅数据图: enter image description here 仅文本图: enter image description here

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接