107 votes

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

J'ai la parcelle 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 n'affiche que des nombres entiers. Que ce soit par le biais d'un arrondi ou d'une méthode plus élégante n'a pas vraiment d'importance pour moi.

8voto

Droplet Points 327

Vous pouvez utiliser le accuracy argument de scales::label_number() o scales::label_comma() pour ça :

fakedata <- data.frame(
  x = 1:5,
  y = c(0.1, 1.2, 2.4, 2.9, 2.2)
)

library(ggplot2)

# without the accuracy argument, you see .0 decimals
ggplot(fakedata, aes(x = x, y = y)) +
  geom_point() +
  scale_y_continuous(label = scales::comma)

# with the accuracy argument, all displayed numbers are integers
ggplot(fakedata, aes(x = x, y = y)) +
  geom_point() +
  scale_y_continuous(label = ~ scales::comma(.x, accuracy = 1))

# equivalent
ggplot(fakedata, aes(x = x, y = y)) +
  geom_point() +
  scale_y_continuous(label = scales::label_comma(accuracy = 1))

# this works with scales::label_number() as well
ggplot(fakedata, aes(x = x, y = y)) +
  geom_point() +
  scale_y_continuous(label = scales::label_number(accuracy = 1))

Créé le 2021-08-27 par le paquet reprex (v2.0.0.9000)

6voto

Nick Points 406

Toutes les réponses existantes semblent nécessiter des fonctions personnalisées ou échouer dans certains cas.

Cette ligne fait des pauses entières :

bad_scale_plot +
  scale_y_continuous(breaks = scales::breaks_extended(Q = c(1, 5, 2, 4, 3)))

Pour plus d'informations, voir la documentation ?labeling::extended (qui est une fonction appelée par scales::breaks_extended ).

En gros, l'argument Q est un ensemble de nombres agréables que l'algorithme essaie d'utiliser pour les ruptures d'échelle. Le tracé original produit des ruptures non entières (0, 2,5, 5 et 7,5) parce que la valeur par défaut de la variable Q comprend 2,5 : Q = c(1,5,2,2.5,4,3) .

EDIT : comme indiqué dans un commentaire, des ruptures non entières peuvent se produire lorsque l'axe des y a une petite plage. Par défaut, breaks_extended() essaie de faire à propos de n = 5 se casse, ce qui est impossible lorsque la portée est trop faible. Des tests rapides montrent que des plages plus larges que 0 < y < 2,5 donnent des ruptures entières ( n peut également être réduite manuellement).

6voto

Bruno Vidigal Points 96

J'ai trouvé cette solution de Joshua Cook et elle a plutôt bien fonctionné.

integer_breaks <- function(n = 5, ...) {
fxn <- function(x) {
breaks <- floor(pretty(x, n, ...))
names(breaks) <- attr(breaks, "labels")
breaks
}
return(fxn)
}

q + geom_bar(position='dodge', colour='black') + 
scale_y_continuous(breaks = integer_breaks())

La source est : https://joshuacook.netlify.app/post/integer-values-ggplot-axis/

4voto

user2738526 Points 733

Cette réponse s'appuie sur la réponse de @Axeman pour répondre au commentaire de Kory selon lequel si les données vont uniquement de 0 à 1, aucune rupture n'est affichée à 1. pretty avec des sorties qui semblent être 1 mais qui ne sont pas identiques à 1 (voir exemple à la fin).

Par conséquent, 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)

les deux 0 et 1 sont indiqués comme des ruptures.

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 raison pour laquelle les arrondis sont nécessaires

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

4voto

Tony Cronin Points 553

Google m'a amené à cette question. J'essaie d'utiliser nombres réels dans une échelle y. Les chiffres de l'échelle y sont en millions.

El échelles paquet comma introduit un virgule à mon grand nombre. Ce post sur R-Bloggers explique une approche simple utilisant le comma méthode :

library(scales)

big_numbers <- data.frame(x = 1:5, y = c(1000000:1000004))

big_numbers_plot <- ggplot(big_numbers, aes(x = x, y = y))+
geom_point()

big_numbers_plot + scale_y_continuous(labels = comma)

Profitez de R :)

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X