J'ai un graphique qui est un simple diagramme en barres du nombre de chaque type d'événement. J'ai besoin que les étiquettes de l'intrigue soient sous l'intrigue car certains événements ont des noms très longs et écrasaient l'intrigue de côté. J'ai essayé de déplacer les étiquettes sous l'intrigue, mais il est maintenant écrasé vers le haut lorsqu'il y a beaucoup de types d'événements. Existe-t-il un moyen d’avoir une taille de tracé statique (c’est-à-dire pour le graphique à barres) afin que les légendes longues n’écrase pas le tracé?
Mon code:
ggplot(counts_df, aes(x = Var2, y = value, fill - Var1)+
geom_bar(stat = "identity") +
theme(legend.position = "bottom") +
theme(legen.direction = "vertical") +
theme(axis.text.x = element_text(angle = -90)
Le résultat:
Je pense que c'est parce que la taille de l'image doit être statique pour que l'intrigue soit sacrifiée pour l'axe. La même chose se produit lorsque je mets une légende sous l'intrigue.
Il existe plusieurs façons d'éviter de superposer des étiquettes ou de comprimer la zone de tracé ou d'améliorer la lisibilité en général. Laquelle des solutions proposées convient le mieux dépend de la longueur des étiquettes et du nombre de barres, ainsi que d’un certain nombre d’autres facteurs. Donc, vous devrez probablement jouer.
Malheureusement, le PO n'a pas inclus d'exemple reproductible, nous devons donc créer nos propres données:
V1 <- c("Long label", "Longer label", "An even longer label",
"A very, very long label", "An extremely long label",
"Long, longer, longest label of all possible labels",
"Another label", "Short", "Not so short label")
df <- data.frame(V1, V2 = nchar(V1))
yaxis_label <- "A rather long axis label of character counts"
Les étiquettes sur l'axe des x sont imprimées verticalement, se superposant:
library(ggplot2) # version 2.2.0+
p <- ggplot(df, aes(V1, V2)) + geom_col() + xlab(NULL) +
ylab(yaxis_label)
p
Notez que la geom_col()
récemment ajoutée au lieu de geom_bar(stat="identity")
est utilisée.
Les étiquettes sur l’axe des x sont pivotées de 90 °, ce qui réduit la zone de tracé:
p + theme(axis.text.x = element_text(angle = 90))
Toutes les étiquettes (y compris l'étiquette d'axe des ordonnées) sont imprimées verticalement, ce qui améliore la lisibilité tout en comprimant la zone de tracé (mais dans une moindre mesure, car la carte est au format paysage):
p + coord_flip()
Les étiquettes sont imprimées verticalement, en évitant les superpositions, en réduisant les zones de tracé. Vous devrez peut-être jouer avec le paramètre width
à stringr::str_wrap
.
q <- p + aes(stringr::str_wrap(V1, 15), V2) + xlab(NULL) +
ylab(yaxis_label)
q
Mon approche préférée: toutes les étiquettes sont imprimées verticalement, ce qui améliore la lisibilité, réduit la zone de tracé. Là encore, vous devrez peut-être jouer avec le paramètre width
à stringr::str_wrap
pour contrôler le nombre de lignes dans lesquelles les étiquettes sont divisées.
q + coord_flip()
scale_x_discrete()
Par souci d’exhaustivité, il convient de mentionner que ggplot2
peut abréger les étiquettes. Dans ce cas, je trouve le résultat décevant.
p + scale_x_discrete(labels = abbreviate)
Pour clarifier, cette question semble être à propos de comment spécifier la taille du panneau dans ggplot2.
Je pense que la bonne réponse à cette question est "tu ne peux pas faire ça".
À l'heure actuelle, il ne semble pas y avoir de paramètre pouvant être défini dans une fonction de ggplot2 permettant d'atteindre cet objectif. S'il y en avait un, je pense que ce serait très probablement sous la forme d'arguments height
et width
à un appel element_rect
dans un appel à theme
(c'est comment nous apportons d'autres modifications au panneau, par exemple en modifiant la couleur d'arrière-plan), mais Rien ne ressemble à ceux de la documentation pour element_rect
, donc ma meilleure hypothèse est qu'il est impossible de spécifier la taille du panneau:
https://ggplot2.tidyverse.org/reference/element.html
La référence suivante est ancienne, mais je ne trouve rien de plus à jour qui confirme de manière positive si c'est le cas ou non:
https://groups.google.com/forum/#!topic/ggplot2/nbhph_arQ7E
Dans cette discussion, quelqu'un demande s'il est possible de spécifier la taille du panneau, et Hadley dit «Pas encore, mais c'est sur ma liste de choses à faire». C'était il y a neuf ans; Je suppose que c'est toujours sur sa liste de choses à faire!