2013-12-23 3 views
2

Я пытаюсь использовать ggplot2 для рисования гистограммы с разными цветовыми барами для разных интервалов х.Передача переменной cut() в ggplot2's aes()

Сославшись на решение Хедли в: how to define fill colours in ggplot histogram?, я прибыл на следующее:

library(ggplot2) 

set.seed(1) 
a <- seq(from=1, to=10000) 
b <- rnorm(10000) 
c <- data.frame(a,b) # Convert to DF 

ggplot(c, aes(x=b, fill=cut(..x.., breaks=c(-2, -1, -0.5, 0, 0.5, 1, 2)))) + 
    geom_histogram(binwidth=0.1, color="steelblue") 

Однако, когда я пытаюсь определить точки разрыва в переменную, MyBreaks, должны быть переданы в ИСЗ(), Я получаю сообщение об ошибке: «Ошибка в cut.default (x, breaks = MyBreaks): объект« MyBreaks »не найден».

Мой код, который генерируется сообщение об ошибке:

MyBreaks <- c(-2, -1, -0.5, 0, 0.5, 1, 2) 
ggplot(c, aes(x=b, fill=cut(..x.., breaks=MyBreaks))) + 
    geom_histogram(binwidth=0.1, color="steelblue") 

Я сделал некоторые исследования подобных ошибок, обнаруженных другими пользователями, но решения не похоже на работу для меня.

Например, решение в How to use earlier declared variables within aes in ggplot with special operators (..count.., etc.) дало: «Ошибка: эстетика должна быть длиной одна или той же длины, что и dataProblems: MyBreaks». Мой код:

ggplot(c, aes(x=b, MyBreaks1=MyBreaks, fill=cut(..x.., breaks=MyBreaks1))) + 
    geom_histogram(binwidth=0.1, color="steelblue") 

Затем я попробовал решение в Local Variables Within aes, но это дало тот же: «Ошибка в cut.default (х, брейки = MyBreaks): объект„MyBreaks“не найден». Мой код:

.e <- environment() 
ggplot(c, aes(x=b, fill=cut(..x.., breaks=MyBreaks)), environment = .e) + 
    geom_histogram(binwidth=0.1, color="steelblue") 

Я проделал базовое программирование раньше, но кривая обучения R действительно крутая! Был бы признателен, если кто-то может помочь!

Заранее благодарен!

ответ

1

Это комментарий от Roland здесь How to use earlier declared variables within aes in ggplot with special operators (..count.., etc.).

ggplot(c, aes(x=b, fill=cut(..x.., breaks=get("MyBreaks", envir=.GlobalEnv)))) + 
geom_histogram(binwidth=0.1, color="steelblue") 
+0

Спасибо за быстрый ответ, @ Jake! Это работает, но можете ли вы объяснить, почему выбранное решение в этом случае не работает для меня? Если это слишком тяжело, укажите URL-адрес, и я буду читать. – NoviceProg

+0

@NoviceProg Я не могу дать вам больше информации, чем сообщение об ошибке. Аргументы, переданные в 'aes', должны быть длиной 1 или той же длиной, что и данные. В ссылке 'k' всего лишь одно число, поэтому оно имеет длину 1. Вы можете копать исходный код' ggplot2', чтобы выяснить, почему существует ограничение по длине –

+0

Нет проблем, @Jake, вы уже давно помогли ! Я только начинал на R в течение месяца и уже перегружен его сложностью. На этом этапе «почему» является второстепенным по отношению к «как» и «чему». Давайте посмотрим, есть ли другие решения на этом пути. Еще раз спасибо! – NoviceProg

Смежные вопросы