Как сгенерировать несколько графиков с помощью для l oop в R - PullRequest
0 голосов
/ 05 февраля 2020

Я хотел бы создать серию графиков с циклами for. Для каждого графика у меня есть CSV-файл и разные заголовки. Каждый график должен быть сохранен как PNG и SVG. Каждый график должен быть создан в разных стилях (= темы).

Все CSV-файлы имеют три столбца (год, тип, значение), а график представляет собой линейный график с годами в виде X и значением для оси Y. Каждый «тип» приводит к строке на графике.

Я начал создавать сценарий для одного графика:

library(ggplot2)
library(ggthemes)

filename = "firstgraph"
filename_csv = paste0(filename,".csv")
titlestring = "Title of [firstgraph]"
labelstrings = c("\"label1\"", "\"label2\"", "\"label3\"")

my.data <- read.csv(file=filename_csv, sep = ";", header = TRUE)

# Plot
my.data %>%
  ggplot( aes(x=year, y=value, group=type, color=type)) +
  geom_line(size=1.5) +
  labs(title = titlestring, 
       subtitle = "static subtitle", 
       x = "Jahr", 
       y = "%", 
       caption = "static caption") +
  scale_x_continuous(breaks=seq(1800,2015,10)) +
  scale_y_continuous(breaks=seq(0,100,10)) +
  theme_economist() + scale_color_economist(labels = labelstrings, 
                                            name = "Variante") -> plot_1

plot_1

svg(filename=paste0("plot_",filename,".svg"), 
    width=16, 
    height=7, 
    pointsize=12)
plot_1
dev.off()

png(filename=paste0("plot_",filename,".png"), 
    type = "cairo",
    width=2000, 
    height=800, 
    pointsize=16,
    res=96)
plot_1
dev.off()

Это прекрасно работает и генерирует SVG и PNG-версию упомянутый график. Теперь я хотел бы сделать это для серии графиков и расширить скрипт с помощью циклов for.

library(ggplot2)
library(ggthemes)

styles <- c("1", "2")
filenames <- c("firstgraph", "secondgraph")
labelstring_list <- matrix(list(), nrow=2, ncol=1)
labelstring_list[[1,1]] <- c("\"label1\"", "\"label2\"", "\"label3\"")
labelstring_list[[2,1]] <- c("\"label2_1\"", "\"label2_2\"", "\"label2_3\"")

i = as.integer(1)
for(mname in filenames) 
  {
  filename_csv = paste0(mname,".csv")
  titlestring = paste0("Entwicklung des Gebrauchs von [", mname, "]")
  labelstrings = labelstring_list[i]

  my.data <- read.csv(file=filename_csv, sep = ";", header = TRUE)

  my.data %>%
    ggplot( aes(x=year, y=value, group=type, color=type)) +
    geom_line(size=1.5) +
    labs(title = titlestring, 
         subtitle = "static subtitle", 
         x = "Jahr", 
         y = "%", 
         caption = "static subtitle") +
    scale_x_continuous(breaks=seq(1800,2015,10)) +
    scale_y_continuous(breaks=seq(0,100,10)) -> plot_1

  for(style in styles)
    {
    if(style=="1") 
      {
      plot_1 +
        theme_economist() + scale_color_economist(labels = labelstrings, 
                                                  name = "Variante") -> plot_x
      }
    if(style=="2") 
      {
      plot_1 +
        theme_wsj()+ scale_colour_wsj("colors6",labels = labelstrings, 
                                      name = "Variante") -> plot_x
      }

    svg(filename=paste0("plot_",mname,"_",style,".svg"), 
        width=16, 
        height=7, 
        pointsize=12)
      plot_x
    dev.off()

    png(filename=paste0("plot_",mname,"_",style,".png"), 
        type = "cairo",
        width=2000, 
        height=800, 
        pointsize=16,
        res=96)
      plot_x
    dev.off()

    }

  i = (i+1)
  }

Это больше не работает. У меня нет ошибок в консоли, и создаются следующие файлы:

  • plot_firstgraph_1.svg
  • plot_firstgraph_2.svg
  • plot_secondgraph_1.svg
  • plot_secondgraph_2.svg

Все эти файлы имеют размер 223 байта и они пусты. Ожидаемые файлы PNG НЕ созданы.

Я проверил с помощью print(), правильные ли имена и тому подобное есть в переменных и все ли в порядке:

  print(mname)
  print(filename_csv)
  print(titlestring)
  print(labelstrings)

Это выводит:

[1] "firstgraph"
[1] "firstgraph.csv"
[1] "Entwicklung des Gebrauchs von [firstgraph]"
[[1]]
[1] "\"label1\""   "\"label2\"" "\"label3\"" 

[1] "secondgraph"
[1] "secondgraph.csv"
[1] "Entwicklung des Gebrauchs von [secondgraph]"
[[1]]
[1] "\"label2_1\""   "\"label2_2\"" "\"label2_3\"" 

Мне кажется, это нормально, но, как я уже сказал, PNG не создаются, а SVG пусты. Я пытался генерировать только PNG (и не SVG), которые не работали.

Может кто-нибудь сказать мне, где я ошибаюсь?

Большое спасибо.

1 Ответ

0 голосов
/ 05 февраля 2020

Можете ли вы попробовать заменить

png(filename=paste0("plot_",mname,"_",style,".png"), 
    type = "cairo",
    width=2000, 
    height=800, 
    pointsize=16,
    res=96)
  plot_x
dev.off()

на

plot_x
mirror <- recordPlot()
png(filename=paste0("plot_",mname,"_",style,".png"), 
    type = "cairo",
    width=2000, 
    height=800, 
    pointsize=16,
    res=96)
replayPlot(mirror)
dev.off()

в вашем l oop и провести повторное тестирование?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...