No se puede replicar este gráfico de ggplot2
No puedo replicar un ejemplo de la ggroughbiblioteca (https://xvrdm.github.io/ggrough/articles/Customize%20chart.html). En particular, estoy tratando de replicar la siguiente trama (menos los aspectos de la fuente):
El código es del mismo enlace de arriba debajo del encabezado "Kindergarten".
Estoy usando el siguiente código:
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)
Sin embargo, no puedo replicar lo anterior. Esto es lo que obtengo:
Una vez más, no estoy preocupado por las fuentes, pero quiero que el geom_area sombreado funcione. Actualmente no se procesa en absoluto. Como referencia, esto es lo pque produce el objeto (es decir, la trama antes de que pase por el ggroughprocesamiento):
También tenga en cuenta que puedo replicar el ejemplo "Blueprint", que usa geom_col. Por lo tanto, parece que algo va mal con el ggroughprocesamiento del geom_area, pero no estoy seguro.
Respuestas
El paquete ggrough no funciona bien con la versión actual de ggplot2 geom_area, porque busca el área de destino en los nodos xml que llevan el nombre "polilínea". En versiones anteriores de ggplot2, esto probablemente funcionó bien, porque cada área estaba rodeada por una polilínea. En versiones más recientes, sin embargo, este ya no es el caso (ver cambios importantes en 3.3.0 ).
Vea si lo siguiente funciona para usted:
- Defina una versión de la
parse_*función que busque "polígono", en lugar de "polilínea".
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"))
}
}
- Cambie la función no exportada correspondiente en ggrough para usar las
parse_polygonscapas recién definidas para GeomArea.
Además, agregué GeomRibbon (que parecía faltar en el original, pero en realidad es un caso más general de GeomArea) y moví GeomViolin de parse_areasa parse_polygons, porque enfrenta el mismo problema.
(Nota: GeomSmooth probablemente también se romperá, pero creo que su función de análisis requerirá un poco más de ajustes, en comparación con GeomRibbon / GeomViolin, y no veo un caso de uso para ello ...)
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))
}
Prueba:
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)
Prueba adicional para geom_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)
Información de la sesión:
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
Escribo esto como respuesta, porque sería demasiado largo para los comentarios.
También probé el ggrough paquete por ti:
El siguiente ejemplo de su archivo léame de github funciona perfectamente:
library(ggplot2)
count(mtcars, carb) %>%
ggplot(aes(carb, n)) +
geom_col() +
labs(title="Number of cars by carburator count") +
theme_grey(base_size = 16) -> p
p
library(ggrough)
options <- list(
Background=list(roughness=8),
GeomCol=list(fill_style="zigzag", angle_noise=0.5, fill_weight=2))
get_rough_chart(p, options)
Sin embargo, cuando estoy probando tu ejemplo:
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
p
Eso está bien hasta aquí, esto daría la siguiente imagen:
Ahora necesitaríamos agregar la parte ggrough.
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)
Obtengo prácticamente el mismo resultado que tú:
Llegué a la misma conclusión que tú:
Entonces parece que algo va mal con ggrough procesando el área geom_area
Incluso podría usar las mismas configuraciones para la parte de ggrough con éxito (con la única diferencia GeomCol) para el ejemplo de número de autos anterior.
Como dice la página de Github:
ggrough es un trabajo en progreso y todavía tiene grandes errores. ¡Las contribuciones son bienvenidas! "
Hicieron su último compromiso de Git hace 2 años.
Ahora, dado que la trama que quería crear es de sus propios ejemplos, estoy bastante seguro de que alguna vez funcionó. (Quiero decir, ¿por qué subirían tramas falsas?)
Entonces, si está realmente desesperado, puede intentar:
Instale una versión de ggplot2 (y otros paquetes requeridos) de hace 2 años
Instale una versión de confirmación anterior del
ggroughpaquete. Tal vez hicieron un compromiso que rompió el ejemplo de trabajo que alguna vez fue.
O intentas arreglar su paquete;)