Заставляя метку оси ggplot2 быть только целочисленной и давать надлежащие разрывы
Я рисую barchart для дискретных данных, и ggplot по умолчанию меняет ось y для меня, но дает мне метку оси y с разрывами в интервале 0,5, который мне не нравится. Я пробовал scale_y_discrete
, но для каждого дискретного значения даются разрывы по оси y, что тоже не хорошо.
Могу ли я заставить разбиение по оси Y состоять только из целочисленного числа и дать соответствующие разрывы для каждого из фасетов?
Пример script выглядит следующим образом:
set.seed(1)
chart.data <- data.frame(x=rep(LETTERS[1:10],3),
y=c(sample(0:10,10,replace=TRUE),
sample(0:100,10,replace=TRUE),
sample(0:1000,10,replace=TRUE)),
group=sort(rep(1:3,10)))
chart <- ggplot(data=chart.data,aes(x=x,y=y))
chart <- chart + geom_bar(stat="identity")
chart <- chart + scale_y_discrete()
chart <- chart + facet_wrap(facets=~group,nrow=1,scale="free_y")
Обновление # 1
Поскольку пост рассматривается как возможный дубликат, script уточняется, чтобы показать более сложный сценарий.
Ответы
Ответ 1
Во-первых, поскольку ваши данные y непрерывны, вы должны использовать scale_y_continuous()
. В этой функции вы можете добавить аргумент breaks= pretty_breaks()
(добавить библиотеку scales
, чтобы использовать функцию pretty_breaks()
). Если вы не указали номер внутри pretty_breaks()
, тогда в этом случае вы получите целые числа по оси y. Вы можете установить количество разрывов для отображения, например, pretty_breaks(4)
, но для первой грани, где у вас есть диапазон 0-10, он все равно будет отображать только целые значения, а количество разрывов будет больше, чтобы получить "хорошие" номера.
library(scales)
ggplot(data=chart.data,aes(x=x,y=y)) +
geom_bar(stat="identity") +
facet_wrap(facets=~group,nrow=1,scale="free_y")+
scale_y_continuous(breaks= pretty_breaks())
Ответ 2
Вы также можете указывать разрывы в функции. Ниже приведены несколько примеров того, как вы могли это сделать. Также посмотрите аргумент breaks в ?discrete_scale
.
chart + scale_y_discrete(breaks=function(n) c(0, floor(max(n)/2), max(n)))
chart + scale_y_discrete(breaks=function(n) n[floor(length(n)/5)*1:5+1])
chart + scale_y_discrete(breaks=function(n) 10^(ceiling(log10(max(n)))-1)*2*0:5)