Как отображать только целые значения на оси с помощью ggplot2
У меня есть следующий график:
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())
Я хочу, чтобы ось y отображала только целые числа. Независимо от того, выполняется ли это путем округления или с помощью более элегантного метода, для меня это не очень важно.
Ответы
Ответ 1
С scale_y_continuous()
и аргументом breaks=
вы можете установить точки прерывания для оси y целыми числами, которые вы хотите отобразить.
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))
Ответ 2
Если у вас есть пакет scales
, вы можете использовать pretty_breaks()
без необходимости вручную указывать перерывы.
q + geom_bar(position='dodge', colour='black') +
scale_y_continuous(breaks= pretty_breaks())
Ответ 3
Это то, что я использую:
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)))))
Ответ 4
Вы можете использовать собственный лейбл. Например, эта функция гарантирует получение целочисленных разрывов:
int_breaks <- function(x, n = 5) pretty(x, n)[pretty(x, n) %% 1 == 0]
Использовать как
+ scale_y_continuous(breaks = int_breaks)
Ответ 5
Другим вариантом является управление форматированием меток с помощью специального форматирования
q + geom_bar(position='dodge', colour='black')+
scale_y_continuous(labels = function (x) floor(x))
Смотрите пакеты scales
для других популярных форматов, таких как percent
, dollar
,...
Ответ 6
Эти решения не помогли мне и не объясняли решения.
Аргумент breaks
для scale_*_continuous
функций scale_*_continuous
можно использовать с пользовательской функцией, которая принимает ограничения в качестве входных данных и возвращает разрывы в качестве выходных данных. По умолчанию пределы оси будут расширены на 5% с каждой стороны для непрерывных данных (относительно диапазона данных). Пределы оси, вероятно, не будут целочисленными значениями из-за этого расширения.
Решение, которое я искал, состояло в том, чтобы просто округлить нижний предел до ближайшего целого числа, округлить верхний предел до ближайшего целого числа, а затем сделать разрывы в целочисленных значениях между этими конечными точками. Поэтому я использовал функцию breaks:
brk <- function(x) seq(ceiling(x[1]), floor(x[2]), by = 1)
Требуемый фрагмент кода:
scale_y_continuous(breaks = function(x) seq(ceiling(x[1]), floor(x[2]), by = 1))
Воспроизводимый пример из оригинального вопроса:
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())
Ответ 7
Этот ответ основывается на ответе @Axeman для ответа на комментарий kory о том, что если данные идут только от 0 до 1, разрыв не отображается на 1. Это, по-видимому, из-за неточности в pretty
при выводе, который, как представляется, 1 не идентичен до 1 (см. пример в конце).
Поэтому, если вы используете
int_breaks_rounded <- function(x, n = 5) pretty(x, n)[round(pretty(x, n),1) %% 1 == 0]
с
+ scale_y_continuous(breaks = int_breaks_rounded)
и 0, и 1 показаны как перерывы.
Пример для иллюстрации отличия от Axeman's
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)
Оба будут работать с данными, представленными в первоначальном вопросе.
Иллюстрация, почему требуется округление
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