在ggplot2中创建新Geom时出现Fontsize错误

G.A*_*ose 6 r ggplot2 r-grid ggproto

我正在尝试创建一个新的geom,它将根据飓风数据创建一个风半径图表.

运行此操作所需的数据来自以下内容:

storm_observation <- data_frame(longitude = c(-89.6, -89.6, -89.6),
                            latitude = c(29.5, 29.5, 29.5),
                            wind_speed = c("34", "50", "64"),
                            ne = c(200, 120, 90),
                            nw = c(100, 75, 60),
                            se = c(200, 120, 90),
                            sw = c(150, 75, 60))
Run Code Online (Sandbox Code Playgroud)

我创建新Geom的代码包含在下面,但是抛出了与fontsize相关的奇怪错误:

check.length(gparname)出错:'gpar'元素'fontsize'的长度不能为0

我试图在default_aesgpar()函数中包含fontsize ,但它仍然导致相同的错误.任何帮助,将不胜感激.注:此要求tidyr,dplyrgeosphere包.

GeomHurricane <- ggproto("GeomPolygon", Geom,
                     required_aes = c("x", "y", "r_ne", "r_se", "r_nw", "r_sw",
                                      "fill", "colour"),
                     default_aes = aes(scale_radii = 0.8, alpha = 0.8, linetype = 1, size = 0.5),


                     draw_group = function(data, panel_scales, coord) {

                       ## Create function for conditional mutation
                       mutate_cond <- function(.data, condition, ..., envir = parent.frame()) {
                         condition <- eval(substitute(condition), .data, envir)
                         .data[condition, ] <- .data[condition, ] %>% mutate(...)
                         .data
                       }

                       ## Create df of bearings for later joining
                       bearingDF <- tibble::data_frame(bearing = c(360,1:90,90:180,180:270,270:360),
                                                       direction = rep(c("r_ne", "r_se", "r_sw", "r_nw"),
                                                                       each = 91)) %>%
                         dplyr::bind_rows(tibble::data_frame(bearing = rep(0, 4),
                                                             direction = c("r_ne", "r_se", "r_sw", "r_nw")))

                       ## Transform data in tidy format and combine with bearings
                       data <- data %>%
                         dplyr::select(x, y, r_ne, r_nw, r_se, r_sw, colour, fill,
                                       PANEL, group, scale_radii, alpha, linetype,
                                       size) %>%
                         tidyr::gather(direction, distance, -x, -y, -colour, -fill,
                                       -PANEL, -group, -scale_radii, -alpha, -linetype,
                                       -size) %>%
                         dplyr::mutate(distance = distance * 1852 * scale_radii) %>%
                         dplyr::left_join(bearingDF, by = "direction") %>%
                         mutate_cond(bearing == 0, distance = 0)

                       ## Generate correct lat/lon for perimeter of polygons
                       data <- data %>%
                         dplyr::bind_cols(as.data.frame(geosphere::destPoint(as.matrix(data[,1:2]),
                                                                             data$bearing,
                                                                             data$distance))) %>%
                         dplyr::select(-x, -y) %>%
                         dplyr::rename(x = lon, y = lat)

                       ## Coord transform and take first row
                       coords <- coord$transform(data, panel_scales)
                       first_row <- coords[1, , drop = FALSE]

                       grid::polygonGrob(
                         coords$x, coords$y, 
                         default.units = "native",
                         gp = grid::gpar(
                           col = first_row$colour,
                           fill = scales::alpha(first_row$fill, first_row$alpha),
                           lwd = first_row$size * .pt,
                           lty = first_row$linetype
                         )
                       )
                     })

geom_hurricane <- function(mapping = NULL, data = NULL, stat = "identity", position = "identity",
                       na.rm = FALSE, show.legend = NA, inherit.aes = TRUE, ...) {
layer(geom = GeomHurricane, mapping = mapping, data = data, stat = stat,
position = position, show.legend = show.legend, inherit.aes = inherit.aes,
params = list(na.rm = na.rm, ...))}
Run Code Online (Sandbox Code Playgroud)

以下是使用新geom创建地图的代码:

get_map("Louisiana", zoom = 6, maptype = "toner-background", source = "stamen") %>%
  ggmap(extent = "device") +
  geom_hurricane(data = storm_observation,
             aes(x = longitude, y = latitude,
                 r_ne = ne, r_se = se, r_nw = nw, r_sw = sw,
                 fill = wind_speed, color = wind_speed)) +
  scale_color_manual(name = "Wind speed (kts)",
                 values = c("red", "orange", "yellow")) +
  scale_fill_manual(name = "Wind speed (kts)",
                values = c("red", "orange", "yellow"))
Run Code Online (Sandbox Code Playgroud)

G.A*_*ose 9

我想到了.不知何故忘记包括draw_key = draw_key_polygon,一旦我添加回ggproto功能一切正常.谢谢!