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

Есть ли способ манипулировать разрывами шкалы ggplot и ярлыками?

ggplot обычно делает хорошую работу по созданию разумных перерывов и ярлыков в масштабах.

Тем не менее, я нахожу, что в сюжете с множеством граней и, возможно, в выражении formatter= метки, как правило, становятся слишком "плотными" и надпечатками, например, на этом рисунке:

df <- data.frame(
        fac=rep(LETTERS[1:10], 100),
        x=rnorm(1000)
)

ggplot(df, aes(x=x)) + 
  geom_bar(binwidth=0.5) + 
  facet_grid(~fac) + 
  scale_x_continuous(formatter="percent")

enter image description here

Я знаю, что я могу явно указать разрывы и метки шкал, предоставив аргументы breaks= и scale= для scale_x_continuous.

Тем не менее, я обрабатываю данные опроса со многими вопросами и десятком перекрестков, поэтому вам нужно найти способ сделать это автоматически.

Есть ли способ сообщить ggplot автоматически вычислять разрывы и метки, но их меньше, скажем, как минимум, максимум и нулевую точку?

EDIT: В идеале я не хочу указывать минимальную и максимальную точки, но как-то использовать встроенную тренировку шкал ggplot и использовать установленные по умолчанию пределы шкалы.

4b9b3361

Ответ 1

Вы можете передать аргументы, такие как min() и max() в своем вызове ggplot, чтобы динамически указать разрывы. Похоже, вы собираетесь применять это по широкому спектру данных, чтобы вы могли рассмотреть возможность обобщения этого в функцию и возиться с форматированием, но этот подход должен работать:

ggplot(df, aes(x=x)) + 
  geom_bar(binwidth=0.5) + 
  facet_grid(~fac) + 
  scale_x_continuous(breaks = c(min(df$x), 0, max(df$x))
    , labels = c(paste( 100 * round(min(df$x),2), "%", sep = ""), paste(0, "%", sep = ""), paste( 100 * round(max(df$x),2), "%", sep = ""))
    )

или поверните текст оси x с помощью opts(axis.text.x = theme_text(angle = 90, hjust = 0)), чтобы создать что-то вроде:

enter image description here

Обновление

В последней версии ggplot2 аргументы breaks и labels для scale_x_continuous принимают функции, поэтому можно сделать что-то вроде следующего:

myBreaks <- function(x){
    breaks <- c(min(x),median(x),max(x))
    names(breaks) <- attr(breaks,"labels")
    breaks
}

ggplot(df, aes(x=x)) + 
  geom_bar(binwidth=0.5) + 
  facet_grid(~fac) + 
  scale_x_continuous(breaks = myBreaks,labels = percent_format()) + 
  opts(axis.text.x = theme_text(angle = 90, hjust = 1,size = 5))