Есть ли способ манипулировать разрывами и метками масштаба ggplot? - PullRequest
30 голосов
/ 21 марта 2011

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

РЕДАКТИРОВАТЬ: В идеале я не хочу указывать минимальные и максимальные баллы, но каким-то образом подключиться к встроенному обучению весов ggplot и использовать рассчитанные по умолчанию пределы шкалы.

1 Ответ

26 голосов
/ 21 марта 2011

Вы можете передать аргументы, такие как 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))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...