r - 无法复制此 ggplot2 图

标签 r ggplot2 ggrough

我无法从 ggrough 复制示例库 ( https://xvrdm.github.io/ggrough/articles/Customize%20chart.html )。特别是,我试图复制以下情节(减去字体方面):
enter image description here
代码来自上面“幼儿园”标题下的相同链接。
我正在使用以下代码:

library(hrbrthemes)
library(tidyverse)
library(gcookbook)
library(ggplot2)
library(ggrough)
ggplot(uspopage, aes(x=Year, y=Thousands, fill=AgeGroup)) + 
    geom_area(alpha=0.8) +
    scale_fill_ipsum() +
    scale_x_continuous(expand=c(0,0)) +
    scale_y_comma() -> p 

options <- list(GeomArea=list(fill_style="hachure", 
                              angle_noise=0.5,
                              gap_noise=0.2,
                              gap=1.5,
                              fill_weight=1))
get_rough_chart(p, options)
但是,我无法复制上述内容。这是我得到的:
enter image description here
同样,我不担心字体,但确实想让阴影 geom_area 工作。它目前根本不渲染。作为引用,这里是 p对象产量(即,经过 ggrough 处理之前的图):
enter image description here
另请注意,我可以复制使用 geom_col 的“蓝图”示例。 .所以看来 ggrough 出了点问题处理 geom_area ,但不确定。

最佳答案

ggrough 包不适用于当前版本的 ggplot2 geom_area ,因为它在带有名称“折线”的 xml 节点中查找目标区域。在旧版本的 ggplot2 中,这可能工作得很好,因为每个区域都被多段线包围。但是,在最近的版本中,情况不再如此(请参阅 breaking changes under 3.3.0 )。
看看以下是否适合您:

  • 定义 parse_* 的版本寻找“多边形”而不是“折线”的函数。
  • parse_polygons <- function (svg) {
      shape <- "polygon" # was "polyline" in ggrough:::parse_areas
      keys <- NULL
      ggrough:::parse_shape(svg, shape, keys) %>% {
        purrr::map(., 
                   ~purrr::list_modify(.x, 
                                       points = stringr::str_squish(.x$points) %>% 
                                         {stringr::str_glue("M{.}Z")}, 
                                       shape = "path"))
      }
    }
    
  • 将ggrough中对应的未导出函数改为使用新定义的parse_polygons用于 GeomArea 图层。

  • 此外,我添加了 GeomRibbon(它似乎从原始版本中丢失,但实际上是 GeomArea 的更一般情况)并将 GeomViolin 从 parse_areas 移过来至 parse_polygons ,因为它面临同样的问题。
    (注意:GeomSmooth 也可能会崩溃,但我认为与 GeomRibbon/GeomViolin 相比,它的解析函数需要更多的调整,而且我没有看到它的用例......)
    trace(ggrough:::parse_rough, edit = TRUE)
    
    # paste the following function into the pop-up window
    function (svg, geom) {
      rough_els <- list()
      if (geom %in% c("GeomCol", "GeomBar", "GeomTile", "Background")) {
        rough_els <- append(rough_els, parse_rects(svg))
      }
      if (geom %in% c("GeomSmooth", "Background")) {   # removed GeomArea / GeomViolin from here
        rough_els <- append(rough_els, parse_areas(svg))
      }
      if (geom %in% c("GeomArea", "GeomRibbon", "GeomViolin")) {  # new condition here
        rough_els <- append(rough_els, parse_polygons(svg))
      }
      if (geom %in% c("GeomPoint", "GeomJitter", "GeomDotPlot", "Background")) {
        rough_els <- append(rough_els, parse_circles(svg))
      }
      if (geom %in% c("GeomLine", "GeomSmooth", "Background")) {
        rough_els <- append(rough_els, parse_lines(svg))
      }
      if (geom %in% c("Background")) {
        rough_els <- append(rough_els, parse_texts(svg))
      }
      purrr::map(rough_els, ~purrr::list_modify(.x, geom = geom))
    }
    
    测试:
    library(ggplot2)
    library(ggrough)
    
    uspopage <- gcookbook::uspopage
    p <- ggplot(uspopage, aes(x=Year, y=Thousands, fill=AgeGroup)) + 
      geom_area(alpha=0.8) +
      scale_x_continuous(expand=c(0,0)); p
    options <- list(GeomArea=list(fill_style="hachure", 
                                  angle_noise=0.5,
                                  gap_noise=0.2,
                                  gap=1.5,
                                  fill_weight=1))
    get_rough_chart(p, options)
    
    geom_area plotgeom_ribbon 的附加测试:
    # using example from geom_ribbon help page
    pp <- data.frame(year = 1875:1972, level = as.vector(LakeHuron)) %>%
      ggplot(aes(year)) +
      geom_ribbon(aes(ymin = level - 1, ymax = level + 1), 
                  fill = "grey70")
    options <- list(GeomRibbon=list(fill_style="hachure", 
                                    angle_noise=0.5,
                                    gap_noise=0.2,
                                    gap=1.5,
                                    fill_weight=1))
    get_rough_chart(pp, options)
    
    geom_ribbon plot
    session 信息:
    R version 4.0.1 (2020-06-06)
    Platform: x86_64-w64-mingw32/x64 (64-bit)
    Running under: Windows 10 x64 (build 15063)
    
    Matrix products: default
    
    locale:
    [1] LC_COLLATE=English_Singapore.1252  LC_CTYPE=English_Singapore.1252   
    [3] LC_MONETARY=English_Singapore.1252 LC_NUMERIC=C                      
    [5] LC_TIME=English_Singapore.1252    
    
    attached base packages:
    [1] stats     graphics  grDevices utils     datasets  methods   base     
    
    other attached packages:
    [1] gdtools_0.2.2 dplyr_1.0.0   ggrough_0.1.0 ggplot2_3.3.2
    
    loaded via a namespace (and not attached):
     [1] Rcpp_1.0.5        cpp11_0.2.1       pillar_1.4.6      compiler_4.0.1   
     [5] plyr_1.8.6        Rmisc_1.5         forcats_0.5.0     tools_4.0.1      
     [9] boot_1.3-25       digest_0.6.25     jsonlite_1.7.1    lifecycle_0.2.0  
    [13] tibble_3.0.3      gtable_0.3.0      lattice_0.20-41   pkgconfig_2.0.3  
    [17] rlang_0.4.7       rstudioapi_0.11   yaml_2.2.1        xml2_1.3.2       
    [21] withr_2.2.0       stringr_1.4.0     htmlwidgets_1.5.1 systemfonts_0.3.1
    [25] generics_0.0.2    vctrs_0.3.4       grid_4.0.1        tidyselect_1.1.0 
    [29] data.table_1.12.8 svglite_1.2.3.2   glue_1.4.2        R6_2.4.1         
    [33] gcookbook_2.0     tidyr_1.1.0       reshape2_1.4.4    purrr_0.3.4      
    [37] farver_2.0.3      magrittr_1.5      htmltools_0.5.0   scales_1.1.1     
    [41] ellipsis_0.3.1    fortunes_1.5-4    colorspace_1.4-1  labeling_0.3     
    [45] stringi_1.5.3     munsell_0.5.0     crayon_1.3.4     
    

    关于r - 无法复制此 ggplot2 图,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63759571/

    相关文章:

    r - 将水平线添加到 R 中 ggplot2 中的堆叠条形图,并在图例中显示

    r - 按 y 轴上的位置顺序连接 ggplot 中的点

    r - 如何着色形状

    r - 控制 map 图例中的值范围

    r - 向 quantmod::chart_Series 添加垂直线

    r - 在 SQLite 中使用子查询更新表

    r - 基于 R Shiny "html template"的应用程序中的 highcharter 集成

    r - 用 ggplot2 绘制多列