L oop печать серий графиков по порядку (PDF) с использованием ggplot2 в R - PullRequest
0 голосов
/ 11 июля 2020

У меня большой набор данных в результате байесовской логистической c регрессии. Набор данных содержит оценки параметров, доверительные интервалы и т. Д. c (см. Заголовок ниже).

        mean         sd confint_2.5 confint_97.5     Rhat     median    spec    Errorup Errordown
1 -0.7897597 0.18668304  -1.1759960   -0.4517294 1.002211 -0.7811156 Marvulg -0.3293862 -1.957112
2 -0.7891327 0.08145761  -0.9570086   -0.6380287 1.000155 -0.7861764 Viotric -0.1481477 -1.743185
3 -0.6619662 0.26049168  -1.2203315   -0.2059030 1.045208 -0.6440501 Antdioi -0.4381470 -1.864382
4 -0.6571516 0.17940842  -1.0417642   -0.3364415 1.008100 -0.6470382 Eleacic -0.3105968 -1.688802
5 -0.6526717 0.20005184  -1.0816375   -0.2968111 1.005126 -0.6394952 Antcotu -0.3426842 -1.721133
6 -0.6497648 0.16620699  -1.0081607   -0.3555847 1.003738 -0.6384035 Triflav -0.2828188 -1.646564 

У меня есть в общей сложности 714 строк данных, отсортированных (среднее значение) от меньшего к большему. Я использую этот код для построения 50 строк за раз, где a3_sort - это подмножество из 50 строк данных (поэтому вручную выполняю a3_sort <- a3[n:n,),, после чего я распечатываю подмножество и перехожу к следующим 50):

ggplot2::ggplot(data = a3_sort, mapping = aes(x = reorder(spec, mean), y = mean, ymin = confint_97.5, ymax = confint_2.5))+
  geom_pointrange()+
  geom_hline(yintercept = 0, lty = 2)+
  coord_flip()+
  xlab ("species") +ylab ("mean (credibility interval)")+
  theme_bw()

Это работает, и я получаю то, что хочу, но должен быть способ сделать это с меньшим количеством ручного труда?

Мой вопрос: есть ли способ l oop этой процедуры, автоматически сохраняя PDF в рабочий каталог?

Ниже пример того, как выглядит один график: введите описание изображения здесь

Ответы [ 2 ]

1 голос
/ 12 июля 2020

Этот подход может быть адаптирован к вашему случаю:

# Some dummy data:

df <- data.frame(g = letters[1:24],
                 min = sample(0:10, 24, replace = TRUE),
                 mid = sample(11:20, 24, replace = TRUE),
                 max = sample(21:30, 24, replace = TRUE))
library(ggplot2)
library(purrr)

# list of the rows you want printing, this could be automated

plot_range <- list(p1_6 = 1:6, p7_12 = 7:12, p13_18  = 13:18, p19_24 = 19:24)

# plotting function which also sets a title and plot name

gg_plot <- function(df, plot_rows){

title <- paste("Automatic plot rows: ", min(plot_rows), "to", max(plot_rows))
plot_nm <- paste("plots", min(plot_rows), max(plot_rows), sep = "_")
    
p <- ggplot(df[plot_rows, ])+
  geom_segment(aes(x = min , xend = max, y = g, yend = g))+
  geom_point(aes(x = mid, y = g))+
  ggtitle(title)

print(ggsave(plot_nm, p, device = "pdf"))

}

# purrr function which acts as a loop to print each graph and allows a different data frame to be used.

walk(plot_range, ~gg_plot(df = df, plot_rows = .x))
#> Saving 7 x 5 in image
#> NULL
#> Saving 7 x 5 in image
#> NULL
#> Saving 7 x 5 in image
#> NULL
#> Saving 7 x 5 in image
#> NULL

Создано 2020-07-11 с помощью пакета реплекс (v0.3.0)

1 голос
/ 12 июля 2020

Вы можете попробовать это решение. Я тестировал фиктивные данные DF с 714 строками и теми же столбцами, что и у вас. DF в вашем случае - это ваш отсортированный фрейм данных из 714 строк и переменных, которые у вас есть. Я установил код так, чтобы вы могли изменить его, если вам нужна ширина больше 50.

library(zoo)
#Create keys; change 50 if you want a larger window
keys <- seq(1, nrow(DF), 50)
vals=1:length(keys)
#Flag to allocate the position and values
#na.locf is used to complete NA so that we have same index
DF$Flag <- NA
DF$Flag[keys]<-vals
DF$Flag <- na.locf(DF$Flag)
#Then split by flag
ListData <- split(DF,DF$Flag)
#Function to create plot
myplot <- function(x)
{
  tplot <- ggplot2::ggplot(data = x, mapping = aes(x = reorder(spec, mean), y = mean, ymin = confint_97.5, ymax = confint_2.5))+
    geom_pointrange()+
    geom_hline(yintercept = 0, lty = 2)+
    coord_flip()+
    xlab ("species") +ylab ("mean (credibility interval)")+
    theme_bw()
  return(tplot)
}
#Replicate plots
LPlots <- lapply(ListData,myplot)
#Export to pdf
pdf('Myplots.pdf',width = 14)
for(i in c(1:length(LPlots)))
{
  plot(LPlots[[i]])
}
dev.off()
 

В конце концов, у вас будут ваши графики в формате pdf. Надеюсь, это поможет. Дайте мне знать, если у вас есть сомнения.

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