Нужна помощь в устранении ошибки geom_text () в ggplot2 - PullRequest
2 голосов
/ 27 мая 2011

Я обнаружил, как мне кажется, ошибку в использовании geom_text в ggplot2, и мне интересно, есть ли у кого-нибудь обходной путь / может указать, что я делаю неправильно.

Рассмотрим следующий пример кода:

library(ggplot2)

Treatment <- rep(c('C','T'),3)
Group <- rep(c('A','B','C'),each=2)
Response <- c(0.22894321, 0.23391813, 0.92256514, 0.92705167, 0.05982670, 0.09667674)
Differences <- c('+0pts',  '+0pts', '+0pts', '+0pts', '+4pts', '+4pts')

df <- data.frame(Treatment, Group, Response, Differences)

ydef <- c(0.03, 0.03, 0.2)

hist <- ggplot(df, aes(x=Group, y=Response, fill=Treatment, stat="identity"))
hist + geom_bar(position = "dodge")  + geom_text(aes(label = Differences,y=ydef))

Если это работает для вас так же, как и для меня - при использовании самых последних версий ggplot2 и R 2.12.2 - в группах B и C должно быть по два текстовых плавающих предмета, разнесенных на равные расстояния друг от друга. Очевидно, это не то, что мы хотим. Теперь измените ydef так, чтобы

ydef <- c(0.03, 0.03, 0.03)

перезапустите сценарий, описанный выше, и проблема решена - у каждой группы теперь есть только один текстовый плавающий объект, соответствующий различиям (или, точнее, два, расположенные точно друг над другом). Как это имеет смысл? Я использовал эту базовую структуру в довольно крупномасштабном приложении, и у меня не было никаких проблем, пока я не добрался до этого конкретного примера с этими конкретными числами.

Частично проблема может заключаться в том, что я создаю «Различия», добавляя его в виде столбца во фрейм данных и помещая этот текст в диаграмму с помощью geom_text. Если бы был способ сделать то же самое, используя вектор только с тремя символами, я уверен, что это решило бы проблему.

Короче (1) помогите пожалуйста! и (2) здесь потенциально интересная ошибка для рассмотрения сообществом ggplot2.

Ура, Аарон

1 Ответ

2 голосов
/ 27 мая 2011

Я не думаю, что это ошибка, я думаю, что вы не используете aes () должным образом. Эстетика, установленная в aes (), должна ссылаться на переменную во фрейме данных. В вашем фрейме данных (за что некоторые здесь могут упрекать вас в названии 'df') нет переменной с именем ydef. Если вы добавите его в свой фрейм данных, у меня это будет нормально работать:

df$ydef <- rep(ydef,each=2)

Обратите внимание, что значения должны повторяться в соответствии с уровнями группы.

Если вы собираетесь установить эстетику для единственного значения, не содержащегося во фрейме данных, передаваемого в geom, это должно быть просто одно значение, и это должно происходить вне вызова aes ().

РЕДАКТИРОВАТЬ: Чтобы объяснить поведение, которое вы видите, вы передаете вектор длины 3 в ggplot, который затем пытается согласовать его с фреймом данных с 6 строками. Таким образом, R повторяет вектор, приводя к этой ситуации:

A 0.03
A 0.03
B 0.2
B 0.03
C 0.03
C 0.2

Итак, теперь у вас есть два уровня с двумя различными значениями, связанными с ними.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...