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