Impossibile replicare questo grafico ggplot2
Non riesco a replicare un esempio dalla ggroughlibreria (https://xvrdm.github.io/ggrough/articles/Customize%20chart.html). In particolare, sto cercando di replicare la seguente trama (meno gli aspetti del carattere):
Il codice proviene dallo stesso collegamento sopra sotto l'intestazione "Kindergarten".
Sto usando il seguente codice:
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)
Tuttavia, non sono in grado di replicare quanto sopra. Ecco cosa ottengo:
Di nuovo, non sono preoccupato per i caratteri, ma voglio che la geom_area ombreggiata funzioni. Attualmente non esegue il rendering affatto. Per riferimento, ecco cosa pproduce l' oggetto (cioè, la trama prima che passi attraverso l' ggroughelaborazione):
Si noti inoltre che sono in grado di replicare l'esempio "Blueprint", che utilizza geom_col. Quindi sembra che qualcosa stia andando storto con l' ggroughelaborazione di geom_area, ma non sono sicuro.
Risposte
Il pacchetto ggrough non funziona bene con la versione corrente di ggplot2 per geom_area, perché cerca l'area di destinazione nei nodi xml che portano il nome "polilinea". Nelle versioni precedenti di ggplot2, probabilmente funzionava bene, perché ogni area era racchiusa da una polilinea. Nelle versioni più recenti, tuttavia, non è più così (vedere le modifiche sostanziali in 3.3.0 ).
Verifica se quanto segue funziona per te:
- Definisci una versione della
parse_*funzione che cerchi "poligono", piuttosto che "polilinea".
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"))
}
}
- Modificare la corrispondente funzione non esportata in ggrough per utilizzare i nuovi
parse_polygonslayer definiti per GeomArea.
Inoltre, ho aggiunto GeomRibbon (che sembrava mancare dall'originale ma è davvero un caso più generale di GeomArea) e ho spostato GeomViolin da parse_areasa parse_polygons, perché affronta lo stesso problema.
(Nota: probabilmente anche GeomSmooth si romperà, ma penso che la sua funzione di analisi richiederà un po 'più di ritocchi, rispetto a GeomRibbon / GeomViolin, e non vedo un caso d'uso per questo ...)
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))
}
Test:
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)
Test aggiuntivo per 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)
Informazioni sulla sessione:
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
Lo scrivo come risposta, perché sarebbe troppo lungo per i commenti.
Ho provato anche il ggrough pacchetto per te:
Il seguente esempio dal loro readme GitHub funziona perfettamente:
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)
Tuttavia, quando provo il tuo esempio:
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
Va bene fino a qui, questo darebbe la seguente immagine:
Ora dovremmo aggiungere 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)
Ottengo più o meno lo stesso risultato che hai tu:
Sono giunto alla tua stessa conclusione:
Quindi sembra che qualcosa stia andando storto con l'elaborazione di ggrough geom_area
Potrebbe anche utilizzare con successo tutte le stesse impostazioni per la parte ggrough (con l'unica differenza GeomCol) per il numero di auto sopra indicato.
Come dice la pagina Github:
ggrough è un work in progress e ha ancora grossi bug. I contributi sono i benvenuti! "
Hanno fatto il loro ultimo commit Git 2 anni fa.
Ora, poiché la trama che volevi creare è basata sui loro stessi esempi, sono abbastanza sicuro che una volta ha funzionato. (Voglio dire perché dovrebbero caricare trame false)
Quindi se sei davvero disperato potresti provare:
Installa una versione ggplot2 (e altri pacchetti richiesti) da 2 anni fa
Installa una versione precedente del commit dal
ggroughpacchetto. Forse hanno fatto un impegno che ha infranto l'esempio una volta funzionante.
Oppure provi a riparare il loro pacchetto;)