webentwicklung-frage-antwort-db.com.de

Wie werden mit ggplot2 nur ganzzahlige Werte auf einer Achse angezeigt?

Ich habe folgende Handlung:

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

Die y-Achse soll nur Ganzzahlen anzeigen. Ob dies durch Rundung oder durch eine elegantere Methode erreicht wird, ist mir nicht wirklich wichtig.

52
Atticus29

Mit scale_y_continuous() und dem Argument breaks= können Sie die Haltepunkte für die y-Achse auf Ganzzahlen setzen, die Sie anzeigen möchten.

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

Wenn Sie über das Paket scales verfügen, können Sie pretty_breaks() verwenden, ohne die Unterbrechungen manuell angeben zu müssen. 

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

Das ist was ich benutze: 

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

Sie können einen benutzerdefinierten Etikettierer verwenden. Diese Funktion garantiert zum Beispiel, dass nur Ganzzahlbrüche erzeugt werden:

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

Benutzen als 

+ scale_y_continuous(breaks = int_breaks)
7
Axeman

Eine andere Option besteht darin, die Formatierung der Etiketten mit einem benutzerdefinierten Formatierungsprogramm zu steuern

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

Siehe scales-Pakete für andere gängige Formatierer wie percent, dollar, ...

4
agstudy

Diese Lösungen haben bei mir nicht funktioniert und die Lösungen nicht erklärt.

Das Argument breaks für die Funktionen scale_*_continuous Kann mit einer benutzerdefinierten Funktion verwendet werden, die die Grenzwerte als Eingabe verwendet und Unterbrechungen als Ausgabe zurückgibt. Standardmäßig werden die Achsengrenzen für kontinuierliche Daten (relativ zum Datenbereich) auf jeder Seite um 5% erweitert. Die Achsengrenzen sind aufgrund dieser Erweiterung wahrscheinlich keine ganzzahligen Werte.

Die Lösung, nach der ich gesucht habe, bestand darin, einfach die Untergrenze auf die nächste Ganzzahl abzurunden, die Obergrenze auf die nächste Ganzzahl abzurunden und dann bei ganzzahligen Werten Brüche zwischen diesen Endpunkten zu erzeugen. Deshalb habe ich die Pausenfunktion benutzt:

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

Das erforderliche Code-Snippet lautet:

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

Das reproduzierbare Beispiel aus der ursprünglichen Frage ist:

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

Diese Antwort baut auf der Antwort von @ Axeman auf, um den Kommentar von kory zu adressieren, dass, wenn die Daten nur von 0 auf 1 gehen, bei 1 kein Umbruch angezeigt wird. Dies scheint auf die Ungenauigkeit in pretty zurückzuführen zu sein, wobei Ausgaben, die 1 zu sein scheinen, nicht identisch sind zu 1 (siehe Beispiel am Ende).

Deshalb, wenn Sie verwenden

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

mit

+ scale_y_continuous(breaks = int_breaks_rounded)

sowohl 0 als auch 1 werden als Pausen angezeigt.

Beispiel zur Veranschaulichung des Unterschieds zu 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)

Beide werden mit den in der ersten Frage angegebenen Daten arbeiten.

Illustration, warum eine Rundung erforderlich ist

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