web-dev-qa-db-fra.com

Comment maintenir la taille de ggplot avec de longues étiquettes

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:

 enter image description here

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.

9
Sebastian Zeki

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.

Données factices

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"

Diagramme à barres "standard"

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.

 enter image description here

L'approche de l'OP: faire pivoter les étiquettes

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))

 enter image description here

Diagramme à barres horizontales

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()

 enter image description here

Diagramme à barres verticales avec étiquettes enveloppées

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

 enter image description here

Diagramme à barres horizontales avec étiquettes enveloppées

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()

 enter image description here

Addendum: Abréger les étiquettes en utilisant 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)

 enter image description here

18
Uwe

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!

0
Westcroft_to_Apse