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.

99voto

Sealander Points 2439

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

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

64voto

Daniel Gardiner Points 909

C'est ce que j'utilise :

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

44voto

Didzis Elferts Points 29673

Avec scale_y_continuous() et l'argument breaks= vous pouvez définir les points de rupture de l'axe des y en fonction des nombres 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))

24voto

Axeman Points 4664

Vous pouvez utiliser une étiqueteuse personnalisée. Par exemple, cette fonction garantit de ne produire que des ruptures entières :

int_breaks <- function(x, n = 5) {
  l <- pretty(x, n)
  l[abs(l %% 1) < .Machine$double.eps ^ 0.5] 
}

Utiliser comme

+ scale_y_continuous(breaks = int_breaks)

Il fonctionne en prenant les pauses par défaut, et en ne gardant que celles qui sont des entiers. Si elle affiche trop peu de ruptures pour vos données, augmentez n par exemple :

+ scale_y_continuous(breaks = function(x) int_breaks(x, n = 10))

20voto

Nat Points 188

Ces solutions n'ont pas fonctionné pour moi et n'ont pas expliqué les solutions.

El breaks à l'argument scale_*_continuous peuvent être utilisées avec une fonction personnalisée qui prend les limites en entrée et renvoie les ruptures en sortie. Par défaut, les limites des axes seront étendues de 5% de chaque côté pour les données continues (par rapport à la plage de données). Les limites de l'axe ne seront probablement pas des valeurs entières en raison de cette expansion.

La solution que je recherchais consistait simplement à arrondir la limite inférieure à l'entier le plus proche, à arrondir la limite supérieure à l'entier le plus proche, puis à prévoir des ruptures aux valeurs entières entre ces points extrêmes. J'ai donc utilisé la fonction breaks :

brk <- function(x) seq(ceiling(x[1]), floor(x[2]), by = 1)

L'extrait de code requis est le suivant :

scale_y_continuous(breaks = function(x) seq(ceiling(x[1]), floor(x[2]), by = 1))

L'exemple reproductible de la question originale est :

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"
      )
    ),
    row.names = c(NA,-8L),
    class = "data.frame"
  )

ggplot(data3, aes(
  x = factor(IR),
  y = value,
  fill = Legend,
  width = .15
)) +
  geom_col(position = 'dodge', colour = 'black') + ylab('Frequency') + xlab('IR') +
  scale_fill_grey() +
  scale_y_continuous(
    breaks = function(x) seq(ceiling(x[1]), floor(x[2]), by = 1),
    expand = expand_scale(mult = c(0, 0.05))
    ) +
  theme(axis.text.x=element_text(colour="black", angle = 45, hjust = 1), 
        axis.text.y=element_text(colour="Black"),
        panel.grid.major = element_blank(),
        panel.grid.minor = element_blank(),
        panel.border = element_blank(),
        panel.background = element_blank(), 
        axis.ticks.x = element_blank())

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