Подтвердить что ты не робот

Заставляя метку оси 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 уточняется, чтобы показать более сложный сценарий.

4b9b3361

Ответ 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)