Ошибка в is.finite (x) при построении полигонов в ggplot

#r #ggplot2

#r #ggplot2

Вопрос:

После обновления до R 3.5.3 (под Windows) и обновления всех установленных пакетов скрипт, использующий ggplot, больше не работает. Скрипт в основном пытается построить карту, заполняя полигоны на основе определенных уровней.

 for (i in 1:3) {

fill.var<-zona.df[i 8]    
# Mapping municipalities by level (nivel)
ggp <- ggplot(data=zona.df,aes(x=long,y=lat,group=group)) 
ggp <- ggp   geom_polygon(aes(fill=fill.var))     # draw polygons
ggp <- ggp   geom_path(color="grey", linetype=1)  # draw boundaries
ggp <- ggp   coord_equal()   xlab(" ")   ylab(" ")
ggp <- ggp   scale_fill_gradientn(colours=c("green","yellow","orange","red"),na.value
= "transparent", breaks=c(0,1,2,3),labels=c("Normal","Moderado","Alto","Extremo"),
                                  limits=c(0,3)) ggp <- ggp   coord_map("lagrange")
# Overlay 28 areas 
ggp <- ggp   geom_path(data=muni.df, aes(x=long, y=lat, group=group),color="grey", linetype=1)
ggp <- ggp   geom_path(data=muni_area.df, aes(x=long, y=lat, group=group),color="blue", size=0.4)
# Overlay provinces 
ggp <- ggp   geom_path(data=pr.df, aes(x=long, y=lat, group=group),color="black", size=1)
print(ggp)
  

Данные, используемые для заполнения полигонов («fill.var», 1 столбец x 60002 строки), поступают из фрейма данных с именем zona.df

 > head(zona.df)
  zona       long      lat order  hole piece id group nivel1 nivel2 nivel3
1    1 -0.2777490 40.25998     1 FALSE     1  1   1.1      1      2      3
2    1 -0.2652719 40.25012     2 FALSE     1  1   1.1      1      2      3
3    1 -0.2633704 40.24859     3 FALSE     1  1   1.1      1      2      3
4    1 -0.2448370 40.23688     4 FALSE     1  1   1.1      1      2      3
5    1 -0.2418003 40.23496     5 FALSE     1  1   1.1      1      2      3
6    1 -0.2396455 40.23361     6 FALSE     1  1   1.1      1      2      3

> dput(head(zona.df,30))
structure(list(zona = c(1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1), long = c(-0.27774902, 
-0.26527193, -0.26337045, -0.24483699, -0.24180027, -0.2396455, 
-0.2348754, -0.23393393, -0.23880772, -0.24654681, -0.25187707, 
-0.26866825, -0.28338055, -0.29171539, -0.31074526, -0.31179492, 
-0.31203856, -0.31306117, -0.31369715, -0.31414035, -0.31477492, 
-0.31534867, -0.31637842, -0.31722535, -0.3175309, -0.31863818, 
-0.3202096, -0.32107671, -0.32114285, -0.33818943), lat = c(40.25998024, 
40.25011967, 40.24858841, 40.2368797, 40.23496073, 40.2336122, 
40.22491394, 40.22321599, 40.22386393, 40.21180703, 40.20347558, 
40.19665815, 40.20210305, 40.20519903, 40.20969666, 40.20959496, 
40.20967268, 40.21025494, 40.21051292, 40.21089254, 40.21118652, 
40.21123587, 40.21104359, 40.21131546, 40.21131354, 40.21094288, 
40.21012356, 40.20928791, 40.20910028, 40.22051057), order = 1:30, 
    hole = c(FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, 
    FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, 
    FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, 
    FALSE, FALSE, FALSE, FALSE, FALSE), piece = structure(c(1L, 
    1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 
    1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L), .Label = c("1", 
    "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", 
    "13", "14", "15", "16", "17", "18", "19", "20", "21", "22", 
    "23"), class = "factor"), id = c("1", "1", "1", "1", "1", 
    "1", "1", "1", "1", "1", "1", "1", "1", "1", "1", "1", "1", 
    "1", "1", "1", "1", "1", "1", "1", "1", "1", "1", "1", "1", 
    "1"), group = structure(c(1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 
    1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 
    1L, 1L, 1L, 1L, 1L, 1L, 1L), .Label = c("1.1", "2.1", "2.2", 
    "2.3", "3.1", "3.2", "3.3", "4.1", "5.1", "6.1", "6.2", "6.3", 
    "6.4", "7.1", "8.1", "9.1", "10.1", "10.2", "11.1", "11.2", 
    "12.1", "12.2", "13.1", "13.2", "13.3", "13.4", "13.5", "13.6", 
    "13.7", "13.8", "14.1", "15.1", "16.1", "17.1", "17.2", "17.3", 
    "17.4", "17.5", "18.1", "18.2", "19.1", "19.2", "20.1", "20.2", 
    "20.3", "20.4", "20.5", "20.6", "20.7", "20.8", "20.9", "20.10", 
    "20.11", "20.12", "20.13", "20.14", "20.15", "20.16", "20.17", 
    "20.18", "20.19", "20.20", "20.21", "20.22", "21.1", "21.2", 
    "21.3", "21.4", "22.1", "23.1", "24.1", "24.2", "24.3", "24.4", 
    "24.5", "24.6", "24.7", "24.8", "24.9", "24.10", "24.11", 
    "24.12", "24.13", "24.14", "24.15", "24.16", "24.17", "24.18", 
    "24.19", "24.20", "24.21", "24.22", "24.23", "25.1", "26.1", 
    "27.1", "28.1"), class = "factor"), nivel1 = c(1L, 1L, 1L, 
    1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 
    1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L), nivel2 = c(2L, 
    2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 
    2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L), 
    nivel3 = c(3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 
    3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 
    3L, 3L, 3L)), row.names = c(NA, 30L), class = "data.frame")

> class(fill.var)
[1] "data.frame"
> dput(head(fill.var,30))
structure(list(nivel1 = c(1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 
1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 
1L, 1L, 1L, 1L, 1L)), row.names = c(NA, 30L), class = "data.frame")
  

и сообщение об ошибке при попытке построить

 print(ggp)
  

Не знаю, как автоматически выбрать масштаб для объекта типа
данные.фрейм. По умолчанию используется значение continuous. Ошибка в is.finite(x): по умолчанию
метод не реализован для типа ‘list’

информация о сеансе:

 > sessioninfo::session_info()
- Session info --------------------------------------------------------------------------------------------
 setting  value                       
 version  R version 3.5.3 (2019-03-11)
 os       Windows 7 x64 SP 1          
 system   x86_64, mingw32             
 ui       RStudio                     
 language (EN)                        

- Packages ------------------------------------------------------------------------------------------------
 package      * version date       lib source        
 dplyr        * 0.8.0.1 2019-02-15 [1] CRAN (R 3.5.3)
 forcats      * 0.4.0   2019-02-17 [1] CRAN (R 3.5.3)
 ggplot2      * 3.1.0   2018-10-25 [1] CRAN (R 3.5.2)
 lubridate    * 1.7.4   2018-04-11 [1] CRAN (R 3.5.0)
 plyr         * 1.8.4   2016-06-08 [1] CRAN (R 3.5.0)
 purrr        * 0.3.2   2019-03-15 [1] CRAN (R 3.5.3)
 readr        * 1.3.1   2018-12-21 [1] CRAN (R 3.5.2)
 rgdal        * 1.4-3   2019-03-14 [1] CRAN (R 3.5.3)
 sp           * 1.3-1   2018-06-05 [1] CRAN (R 3.5.2)
 stringr      * 1.4.0   2019-02-10 [1] CRAN (R 3.5.3)
 tibble       * 2.1.1   2019-03-16 [1] CRAN (R 3.5.3)
 tidyr        * 0.8.3   2019-03-01 [1] CRAN (R 3.5.3)
 tidyverse    * 1.2.1   2017-11-14 [1] CRAN (R 3.5.0)

[1] C:/Users/paco/Documents/R/win-library/3.5
[2] C:/Program Files/R/R-3.5.3/library
  

Возможно, проблема возникает из-за того, что ggplot построен под R 3.5.2? Должен ли я понизить ggplot2? Установить версию разработчика с github?

Заранее спасибо

Комментарии:

1. на первый взгляд кажется странным, что вы передаете фрейм данных в fill параметр в geom_polygon . по крайней мере, я такого раньше не видел… Вы пробовали geom_polygon(data = fill.var,aes(fill = nivel1)) вместо этого?

2. это может быть связано: github.com/tidyverse/ggplot2/issues/3060 , речь идет о неправильно определенной эстетике, которая отчасти подтверждает мою догадку о том, что что-то не так с fill параметром

3. @jludewig fill.var встроен в цикл for, который fill.var<-zona.df[k] я также пытался использовать geom_polygon(aes(fill=zona.df[k])) . Ваше предложение приводит к другой ошибке Error in FUN(X[[i]], ...) : object 'long' not found

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

5. Он запускается для меня с использованием ggplot2 версии 3.0.0 и R 3.5.1 (не удается опубликовать мой полный session_info в качестве комментария …). Не уверен, поможет ли это вам. Для меня это выглядит как проблема с тем, как ggplot оценивает имена переменных. Извините, я не в своей тарелке