Impossible de répliquer ce tracé ggplot2
Je ne parviens pas à reproduire un exemple de la ggroughbibliothèque (https://xvrdm.github.io/ggrough/articles/Customize%20chart.html). En particulier, j'essaye de reproduire l'intrigue suivante (moins les aspects de police):
Le code provient du même lien ci-dessus sous l'en-tête "Kindergarten".
J'utilise le code suivant:
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)
Cependant, je suis incapable de reproduire ce qui précède. Voici ce que j'obtiens:
Encore une fois, je ne suis pas inquiet pour les polices, mais je veux que le geom_area ombré fonctionne. Actuellement, il ne rend pas du tout. Pour référence, voici ce que produit l' pobjet (c'est-à-dire le tracé avant de passer par le ggroughtraitement):
Notez également que je suis capable de reproduire l'exemple "Blueprint", qui utilise geom_col. Il semble donc que quelque chose ne va pas avec le ggroughtraitement du geom_area, mais pas sûr.
Réponses
Le paquet ggrough ne fonctionne pas bien avec la version actuelle de ggplot2 pour geom_area, car il recherche la zone cible dans les nœuds xml portant le nom "polyline". Dans les anciennes versions de ggplot2, cela fonctionnait probablement bien, car chaque zone était délimitée par une polyligne. Dans les versions plus récentes, cependant, ce n'est plus le cas (voir les changements de rupture sous 3.3.0 ).
Voyez si ce qui suit fonctionne pour vous:
- Définissez une version de la
parse_*fonction qui recherche «polygone» plutôt que «polyligne».
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"))
}
}
- Modifiez la fonction non exportée correspondante dans ggrough pour utiliser les
parse_polygonscouches nouvellement définies pour GeomArea.
De plus, j'ai ajouté GeomRibbon (qui semblait manquer dans l'original mais est vraiment un cas plus général de GeomArea) et déplacé GeomViolin de parse_areasvers parse_polygons, car il est confronté au même problème.
(Remarque: GeomSmooth se cassera probablement aussi, mais je pense que sa fonction d'analyse nécessitera un peu plus de peaufinage, par rapport à GeomRibbon / GeomViolin, et je ne vois pas de cas d'utilisation pour cela ...)
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))
}
Tester:
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 supplémentaire pour 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)
Informations sur la 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
J'écris ceci comme une réponse, car ce serait trop long pour les commentaires.
J'ai également essayé le ggrough package pour vous:
L'exemple suivant de leur fichier readme github fonctionne parfaitement:
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)
Pourtant, quand j'essaye votre exemple:
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
C'est bien jusqu'à ici, cela donnerait l'image suivante:
Maintenant, nous aurions besoin d'ajouter la partie 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)
J'obtiens à peu près le même résultat que vous:
Je suis arrivé à la même conclusion que vous:
Il semble donc que quelque chose ne va pas avec ggrough traitant le geom_area
Pourrait même utiliser tous les mêmes paramètres pour la partie ggrough avec succès (la seule différence étant GeomCol) pour l'exemple du nombre de voitures ci-dessus.
Comme le dit la page Github:
ggrough est un travail en cours et a encore de gros bugs. Les contributions sont les bienvenues! "
Ils ont fait leur dernier commit Git il y a 2 ans.
Maintenant, puisque l'intrigue que vous vouliez créer provient de leurs propres exemples, je suis presque sûr que cela a fonctionné une fois. (Je veux dire pourquoi auraient-ils télécharger de faux complots)
Donc, si vous êtes vraiment désespéré, vous pouvez essayer:
Installez une version de ggplot2 (et d'autres packages requis) d'il y a 2 ans
Installez une ancienne version de commit à partir du
ggroughpackage. Peut-être qu'ils ont fait un engagement qui a brisé l'exemple qui fonctionnait autrefois.
Ou vous essayez de réparer leur paquet;)