web-dev-qa-db-fra.com

Avec ggplot2, puis-je insérer une rupture dans l’axe?

Je veux faire un graphique en barres où l'une des valeurs est beaucoup plus grande que toutes les autres valeurs. Existe-t-il un moyen d'avoir un axe des y discontinu? Mes données sont les suivantes:

df <- data.frame(a = c(1,2,3,500), b = c('a1', 'a2','a3', 'a4'))

p <- ggplot(data = df, aes(x = b, y = a)) + geom_bar() 
p <- p + opts(axis.text.x=theme_text(angle= 90, hjust=1))  + coord_flip()
p

enter image description here

Est-il possible de faire en sorte que mon axe soit compris entre 1 et 10, puis entre 490 et 500? Je ne peux penser à aucune autre façon de représenter les données (à part la transformer, ce que je ne veux pas faire)

44
djq

Comme indiqué ailleurs, ce n'est pas quelque chose que ggplot2 gérera bien, car les haches brisées sont généralement considérées comme discutables.

D'autres stratégies sont souvent considérées comme de meilleures solutions à ce problème. Brian en a mentionné quelques-unes (facettisation, deux graphiques en se concentrant sur différents ensembles de valeurs). Une autre option que les gens négligent trop souvent, en particulier pour les graphiques à barres, consiste à créer un table :

enter image description here

En regardant les valeurs réelles, le 500 ne masque pas les différences entre les autres valeurs! Pour certaines raisons, les tableaux ne sont pas suffisamment respectés, car les données constituent une technique de visualisation. Vous pourriez objecter que vos données comportent de très nombreuses catégories, ce qui devient difficile à manier dans une table. Si tel est le cas, il est probable que votre diagramme à barres contienne trop de barres pour être sensible également.

Et je ne discute pas pour des tables tous le temps. Mais ils sont certainement quelque chose à considérer si vous faites des graphiques à barres avec relativement peu de barres. Et si vous créez des graphiques avec des tonnes de barres, vous devrez peut-être repenser cela de toute façon.

Enfin, il existe également la fonction axis.break dans le package plotrix qui implémente les axes brisés. Cependant, d'après ce que j'ai compris, vous devrez spécifier manuellement les étiquettes d'axe et les positions.

40
joran

Non, ne pas utiliser ggplot. Voir la discussion dans la discussion à http://groups.google.com/group/ggplot2/browse_thread/thread/8d2acbfc59d2f247 où Hadley explique pourquoi cela n’est pas possible mais donne une alternative suggérée les données, on a zoomé dans une région particulière).

26
Brian Diggs

Pas avec ggplot, mais avec plotrix, vous pouvez facilement le faire:

library(plotrix)
gap.barplot(df$a, gap=c(5,495),horiz=T)
20
Wouter

Non, malheureusement non

La crainte est que permettre des axes discontinus mènera à la tromperie du public. Cependant, il existe des cas où ne pas avoir un axe discontinu entraîne une distorsion. 

Par exemple, si l'axe est tronqué, mais qu'il se situe généralement dans un intervalle (disons [0,1]), l'audience peut ne pas remarquer la troncature et tirer des conclusions déformées sur les données. Dans ce cas, un axe discontinu explicite serait plus approprié et transparent.

Comparer:

 Example of good use of continuous vs discontinuous axis

15
milo

Je doute qu'il y ait quelque chose de standard dans R, mais vous pouvez afficher les données sous forme d'une série de cubes partiels 3D. 500 est seulement 5 * 10 * 10, donc ça irait bien. La valeur exacte pourrait être une étiquette. 

Ceci ne devrait probablement être utilisé que si vous devez avez une représentation graphique pour une raison quelconque.

1
Ed Staub

Une stratégie consiste à changer l'axe pour tracer l'échelle du journal. De cette façon, vous réduirez de façon exponentielle la valeur 10

0
webscale