Создание кратных графиков в R - PullRequest
0 голосов
/ 29 апреля 2020

Моя проблема заключается в следующем: я хотел бы создать 151 график в R с помощью GGplot.

Я хотел бы начать представлять свои данные:

У меня есть первый набор данных с именем "df", который содержит 152 столбца. Первые 151 столбец соответствуют Y-переменным. 152-й столбец соответствует переменной x. В то время как у Y есть 151 переменная для 151 графика, переменная x идентична для 151 графика.

Кроме того, у меня есть второй набор данных с именем "df_2". Этот набор данных содержит два столбца: один столбец с именем переменной, с именами переменных из «df» и второй столбец с соответствующим им «устойчивым значением».

В принципе, я бы хотел иметь 151 график в формате pdf , который выглядит как график ниже (со связанными переменными) enter image description here

Вот мой код для получения такого графика

df_base = df
steady_state_df = df_2

ggplot(df_base, aes(x = df_base[, 152])) +
  geom_line(aes(y = df_base$capital), col = "darkorange") +
    geom_line(aes(y = steady_state_df$steady_state[steady_state_df$variables == "capital"]), col = "skyblue") +
    ggtitle(paste(' Figure 11: ',  "Capital", sep='')) +
    theme_bw() + 
    theme(axis.title.x=element_blank(), axis.title.y=element_blank(), plot.title = element_text(family="Times New Roman", hjust = 0.5, margin = margin(t = 20, r = 20, b = 20, l = 20)), legend.position="none", axis.ticks.length=unit(-0.1, "cm"), axis.text.x = element_text(margin = margin(t = 10, r = 10, b = 10, l = 10)), axis.text.y = element_text(margin = margin(t = 10, r = 10, b = 10, l = 10))) +
  scale_x_continuous(breaks= c(0, 20, 40, 60, 80, 100)) +
  scale_x_continuous(sec.axis = dup_axis(labels = NULL)) +
  scale_y_continuous(sec.axis = dup_axis(labels = NULL)) +
    coord_cartesian(xlim = c(0,100), ylim = c(min(df_base$capital), max(df_base$capital))) 

Теперь, когда у меня есть такой "модель кода графа", я хотел бы реализовать al oop, чтобы получить 151 из этих графов, проиндексированных по именам переменных. Вот что я сделал и не работает:


for(i in 1:151){

path = paste("~/Desktop/plotting_task/", varnames[i], ".pdf", sep = "")
pdf(file = path,   # The directory you want to save the file in
    width = 5, # The width of the plot in inches
    height = 5)

ggplot(df_base, aes(x = df_base[, 152])) +
  geom_line(aes(y = df_base[, i]), col = "darkorange") + 
  geom_line(aes(y = steady_state_df$steady_state[steady_state_df$variables == varnames[i]), col = "skyblue") +
  ggtitle(paste(' Figure : ', i, varnames[i], sep='')) +
  theme_bw() + 
  theme(axis.title.x=element_blank(), axis.title.y=element_blank(), plot.title = element_text(family="Times New Roman", hjust = 0.5, margin = margin(t = 20, r = 20, b = 20, l = 20)), legend.position="none", axis.ticks.length=unit(-0.1, "cm"), axis.text.x = element_text(margin = margin(t = 10, r = 10, b = 10, l = 10)), axis.text.y = element_text(margin = margin(t = 10, r = 10, b = 10, l = 10))) + 
  scale_x_continuous(breaks= c(0, 20, 40, 60, 80, 100)) + 
  scale_x_continuous(sec.axis = dup_axis(labels = NULL)) + 
  scale_y_continuous(sec.axis = dup_axis(labels = NULL)) +
  coord_cartesian(xlim = c(0,100), ylim = c(min(df_base[, i]), max(df_base[, i]))) 

dev.off()
} 

Может ли кто-нибудь мне помочь? Бесконечно большое спасибо

1 Ответ

0 голосов
/ 29 апреля 2020

Простой вызов ggplot(df_base, ...) + ... не приводит к построению графика. То, что создает вывод, имеет результат , напечатанный .

При выполнении строки в интерактивном сеансе, т.е. при выполнении ggplot(... или просто 1, интерпретатор неявно вызывает print on этот результат. Т.е.

> 1
## ==> interpreter calls print(1)
[1] 1
> mean(1:4)
## ==> interpreter calls print(mean(1:4))
[1] 2.49
> p <- ggplot(mtcars, aes(wt, mpg)) + geom_point()
> p
## ==> interpreter calls print(p)

Если внутри al oop интерпретатор не будет вызывать print.

Так, каков результат ggplot? Чтобы заглянуть внутрь, используйте функцию str:

> str(p)

Она не содержит сюжета. Вместо этого он содержит данные для построения графика и описание порядка построения. Волшебство c преобразования данных и описания в реальный график происходит в print(p), а точнее в ggplot2:::print.ggplot.

Как вы распечатываете результат в al oop?

Присвойте результат переменной и распечатайте его. Т.е.:

for (i in 1:151) {
  pdf(...)
  p <- ggplot(...) + ...
  print(p)
  dev.off()
}

Редактировать: Если вы выполняете вызовы pdf и dev.off вне из l oop, все графики записывается в один pdf-файл с несколькими страницами.

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