web-dev-qa-db-fra.com

Comment afficher uniquement les valeurs entières sur un axe en utilisant ggplot2

J'ai l'intrigue suivante:

library(reshape)
library(ggplot2)
library(gridExtra)
require(ggplot2)



data2<-structure(list(IR = structure(c(4L, 3L, 2L, 1L, 4L, 3L, 2L, 1L
), .Label = c("0.13-0.16", "0.17-0.23", "0.24-0.27", "0.28-1"
), class = "factor"), variable = structure(c(1L, 1L, 1L, 1L, 
2L, 2L, 2L, 2L), .Label = c("Real queens", "Simulated individuals"
), class = "factor"), value = c(15L, 11L, 29L, 42L, 0L, 5L, 21L, 
22L), Legend = structure(c(1L, 1L, 1L, 1L, 2L, 2L, 2L, 2L), .Label = c("Real queens", 
"Simulated individuals"), class = "factor")), .Names = c("IR", 
"variable", "value", "Legend"), row.names = c(NA, -8L), class = "data.frame")
p <- ggplot(data2, aes(x =factor(IR), y = value, fill = Legend, width=.15))


data3<-structure(list(IR = structure(c(4L, 3L, 2L, 1L, 4L, 3L, 2L, 1L
), .Label = c("0.13-0.16", "0.17-0.23", "0.24-0.27", "0.28-1"
), class = "factor"), variable = structure(c(1L, 1L, 1L, 1L, 
2L, 2L, 2L, 2L), .Label = c("Real queens", "Simulated individuals"
), class = "factor"), value = c(2L, 2L, 6L, 10L, 0L, 1L, 4L, 
4L), Legend = structure(c(1L, 1L, 1L, 1L, 2L, 2L, 2L, 2L), .Label = c("Real queens", 
"Simulated individuals"), class = "factor")), .Names = c("IR", 
"variable", "value", "Legend"), row.names = c(NA, -8L), class = "data.frame")
q<- ggplot(data3, aes(x =factor(IR), y = value, fill = Legend, width=.15))


##the plot##
q + geom_bar(position='dodge', colour='black') + ylab('Frequency') + xlab('IR')+scale_fill_grey() +theme(axis.text.x=element_text(colour="black"), axis.text.y=element_text(colour="Black"))+ opts(title='', panel.grid.major = theme_blank(),panel.grid.minor = theme_blank(),panel.border = theme_blank(),panel.background = theme_blank(), axis.ticks.x = theme_blank())

Je veux que l'axe des Y affiche uniquement des nombres entiers. Que cela soit accompli en arrondissant ou par une méthode plus élégante, ce n'est pas vraiment important pour moi.

52
Atticus29

Avec scale_y_continuous() et l'argument breaks=, vous pouvez définir les points de rupture de l'axe des y sur les entiers que vous souhaitez afficher.

ggplot(data2, aes(x =factor(IR), y = value, fill = Legend, width=.15)) +
    geom_bar(position='dodge', colour='black')+
    scale_y_continuous(breaks=c(1,3,7,10))
31
Didzis Elferts

Si vous avez le package scales, vous pouvez utiliser pretty_breaks() sans avoir à spécifier manuellement les interruptions. 

q + geom_bar(position='dodge', colour='black') + 
scale_y_continuous(breaks= pretty_breaks())
48
Sealander

C'est ce que j'utilise: 

library(scales)

ggplot(data2, aes(x = factor(IR), y = value, fill = Legend, width = .15)) +
  geom_bar(position = 'dodge', colour = 'black') + 
  scale_y_continuous(breaks = function(x) unique(floor(pretty(seq(0, (max(x) + 1) * 1.1)))))
23
Daniel Gardiner

Vous pouvez utiliser une étiqueteuse personnalisée. Par exemple, cette fonction garantit de ne produire que des sauts de nombre entier:

int_breaks <- function(x, n = 5) pretty(x, n)[pretty(x, n) %% 1 == 0] 

Utilisé comme 

+ scale_y_continuous(breaks = int_breaks)
7
Axeman

Une autre option consiste à contrôler le formatage des étiquettes avec un formateur personnalisé.

q + geom_bar(position='dodge', colour='black')+
  scale_y_continuous(labels = function (x) floor(x))

Voir les packages scales pour d'autres formateurs populaires tels que percent, dollar, ...

4
agstudy

Cette réponse s'appuie sur la réponse de @ Axeman pour répondre au commentaire de kory selon lequel si les données ne passent que de 0 à 1, aucune interruption n'est affichée en 1. Cela semble être dû à l'inexactitude dans pretty avec des sorties qui semblent être 1 n'étant pas identique à 1 (voir exemple à la fin).

Donc si vous utilisez

int_breaks_rounded <- function(x, n = 5)  pretty(x, n)[round(pretty(x, n),1) %% 1 == 0]

avec

+ scale_y_continuous(breaks = int_breaks_rounded)

0 et 1 sont représentés par des pauses.

Exemple pour illustrer la différence avec Axeman

testdata <- data.frame(x = 1:5, y = c(0,1,0,1,1))

p1 <- ggplot(testdata, aes(x = x, y = y))+
  geom_point()


p1 + scale_y_continuous(breaks = int_breaks)
p1 + scale_y_continuous(breaks =  int_breaks_rounded)

Les deux fonctionneront avec les données fournies dans la question initiale.

Illustration de la nécessité d'arrondir

pretty(c(0,1.05),5)
#> [1] 0.0 0.2 0.4 0.6 0.8 1.0 1.2
identical(pretty(c(0,1.05),5)[6],1)
#> [1] FALSE
1
user2738526