Экспорт изображений из R в векторный формат с отдельными слоями для текста и графика? - PullRequest
0 голосов
/ 07 ноября 2018

Как я могу экспортировать изображения в R в векторном формате с отдельными слоями для текстовых меток и фактического графика?

Я спрашиваю, потому что я готовлю статью для публикации, и редактор просит, чтобы я

обеспечивает высокое качество, векторный формат, версии [моих] изображений (.ai, .eps, .psd).

Они также утверждают, что

Текст и надписи должны быть в отдельном слое, чтобы можно было редактировать в процессе производства.

Я создал свои графики в ggplot2, и мне удалось экспортировать их в векторный формат (svg, поскольку этот формат показывает непохожую на полупрозрачную заливку eps). либо с помощью ggsave («filename.svg»), либо в одном случае, когда я добавил дополнительный текст с помощью svg («filename.svg») и dev.off () (причина, по которой я здесь не использую фасеты, заключается в том, что в реальном графике Я добавляю уровни значимости к отдельным панелям)

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 Ответ

0 голосов
/ 07 ноября 2018

ggplot не позволит вам экспортировать разные слои из одного и того же графика, насколько мне известно, поэтому вот довольно простой обходной путь. Измените код графика так, чтобы он создавал два графика: на одном изображены только оси и данные, а на другом только текст / метки. На каждом графике вы сохраняете там каждый элемент (чтобы расположение элементов оставалось прежним), но с помощью правок темы, чтобы сделать элементы, которые вы не хотите видеть прозрачными.

Вот как можно изменить график РНК, чтобы получить один график только с данными и второй график только с текстом / метками.

 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

...