как зациклить функцию географического отображения над списком фреймов данных (или субкадровым фреймом данных) - PullRequest
1 голос
/ 18 октября 2019

У меня есть фрейм данных, состоящий из названий видов, долготы и координат широты. Есть 115 различных видов с 25000 лат / длинные координаты. Мне нужно сделать отдельные карты, которые показывают наблюдения для каждого конкретного вида.

Во-первых, я создал функцию, которая будет генерировать тот тип карты, который я хочу, называемый platmaps. когда я вызываю функцию для моего полного набора данных (platmaps(df1)), она создает карту, отображающую все латинские наблюдения.

Затем я построил цикл for, который должен был подставить мою df по названию вида, и вставитьэто подмножество данных в моей функции platmaps. Он работает пару минут, а потом ничего не происходит.

поэтому я затем разделил фрейм данных по названию вида, создал список фреймов данных (out1) и использовал lapply(out1, platmaps), но он только возвратил список имен моих dfs.

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

функция

platmaps<-function(df1){
wm <- wm <- borders("world", colour="gray50", fill="gray50")
ggplot()+ 
coord_fixed()+
wm +
geom_point(data =df1 , aes(x = decimalLongitude, y = decimalLatitude),
           colour = "pink", size = 0.5)

подмножество

for(i in 1:nrow(PP)){
query<-paste(PP$species[i])
p<-subset(df1, df1$species== query))
platmaps(p)
}

список

for (i in 1:length(out1)){
pp<-out1[[i]] 
platmaps(pp)

}

прикладной пример

p =  
wm <- wm <- borders("world", colour="gray50", fill="gray50")
ggplot()+ 
coord_fixed()+
wm +
geom_point(data =df1 , aes(x = decimalLongitude, y = decimalLatitude),
         colour = "pink", size = 0.5)
plots = df1 %>%
group_by(species) %>%
do(plots = p %+% . + facet_wrap(~species))

ошибка дляприменяемый пример:

Ошибка: невозможно добавить объекты ggproto вместе. Вы забыли добавить этот объект в объект ggplot?

Поскольку я новичок в R (и в кодировании), я предполагаю, что синтаксис получен неправильно, или неправильно применяю свою функциюв любой из моих циклов, или я в корне неправильно понимаю, как работает цикл.

образец фрейма данных

species                        decimalLongitude     decimalLatitude
  Platanthera lacera        -71.90000        42.80000
  Platanthera lacera        -90.54861        40.12083
  Platanthera lacera        -71.00889        42.15500
  Platanthera lacera        -93.20833        45.20028
  Platanthera lacera        -72.45833        41.91666
 Platanthera bifolia          5.19800        59.64310
 Platanthera sparsiflora       -117.67472        34.36278

фиксированная функция platmaps

ggplot(data=df1 %>% filter(species == s))+ 
  coord_fixed()+
  borders("world", colour="gray50", fill="gray50")+
  geom_point(aes(x = decimalLongitude, y = decimalLatitude),
             colour = "pink", size = 0.5)+
labs(title=as.character(s))

Ответы [ 2 ]

0 голосов
/ 18 октября 2019

есть аккуратный способ применить любую функцию к списку элементов. Я обрисовал способ сделать это с данными, которые вы добавили. Я не могу заставить работать platmaps, поэтому я только что создал точечный график.

Метод состоит в том, чтобы разбить ваш фрейм данных на отдельные подмножества, используя split(), а затем применить функцию построения графика к результирующему списку, используя lapply(). Поскольку lapply() возвращает список, его можно передать непосредственно в такую ​​функцию, как ggpubr::ggarrange() для визуализации.

library(ggplot2)
plot_function <- function(x){

  p <- ggplot(x, aes(x = decimalLongitude, y = decimalLatitude)) + geom_point()

  p

}

plot_list <- 
df %>% 
  split(.$species) %>% # Separate df into subset dfs based on species column
  lapply(., plot_function) # map plot_function to list

# Display on a grid (many ways to do this - I just find this package simple)
ggpubr::ggarrange(plotlist = plot_list)
0 голосов
/ 18 октября 2019

Поскольку вы не предоставили набор тестовых данных, позвольте мне дать вам общее представление о том, как составить несколько графиков, которые вы сможете просмотреть позже. Приведенный ниже код будет отображать параметры для ряда стран и сохранять PDF-файлы для графиков по заданному пути. Вы можете заменить код за переменной pl в цикле своей функцией.

library(ggplot2)
library(dplyr)

df <- data.frame(country = c(rep('USA',20), rep('Canada',20), rep('Mexico',20)),
                 wave = c(1:20, 1:20, 1:20),
                 par = c(1:20 + 5*runif(20), 21:40 + 10*runif(20), 1:20 + 15*runif(20)))

countries <- unique(df$country)

plot_list <- list()
i <- 1

for (c in countries){
  pl <- ggplot(data = df %>% filter(country == c)) +
    geom_point(aes(wave, par), size = 3, color = 'red') +
    labs(title = as.character(c), x = 'wave', y = 'value') +
    theme_bw(base_size = 16)

  plot_list[[i]] <- pl
  i <- i + 1
}

pdf('path/to/pdf')
pdf.options(width = 9, height = 7)
for (i in 1:length(plot_list)){
  print(plot_list[[i]])
}
dev.off()

После получения графиков (переменная plot_list), мы включаем терминал pdf и печатаем их. В конце мы отключаем pdf терминал.

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