Как добавить горизонтальное уклонение к меткам на гистограмме ggplot2?

Я пытаюсь добавить метки к довольно простой гистограмме (например, geom_bar). position_dodge() внутри geom_text() корректирует расстояние между метками по вертикали, но не по горизонтали. Как я могу заставить ggplot2 правильно распределять мои метки над полосами?

library(tidyr)
library(grid)
library(ggplot2)

data = read.table('temp.dat', header=T)

data <- gather(data, SOA, RT, X0:X1000)

data$ResponseCondition = as.factor(data$ResponseCondition)
levels(data$SOA) = c(0,250,500,1000)
data$SOA = as.numeric(as.character(data$SOA))

p = ggplot(data, aes(y=RT, x=SOA, fill=ResponseCondition, ymax=RT*1.05))
p = p + geom_bar(stat='identity', position=position_dodge())
p = p + geom_text(aes(label=RT), position=position_dodge())

p = p + scale_x_continuous(breaks=c(0,250,500,1000))

p = p + ylab('Response Time (ms)')
p = p + xlab('Precue Interval (ms)')
p = p + theme_bw()
p = p + scale_fill_grey(start = 0.1, end = .9, name='Response condition')

p = p + theme(
    axis.title.x = element_text(vjust=-0.30, size=10),
    axis.title.y = element_text(vjust=1.50, size=10),
    text = element_text(size=10),
    legend.justification=c(1,1), legend.position=c(1,1),
    plot.margin = unit(rep(.5, 4), 'cm'))

ggsave('temp.png', width=10, height=7.5)

Вот гистограмма:

Гистограмма

Вот содержимое temp.dat, необходимое для того, чтобы сделать этот пример полностью рабочим:

ResponseCondition 0    250  500  1000
               28 1254 1056  901  864
               46 1306 1063  889  772
               64 1171  939  786  682
               82 1205  948  821  731

person Doug Morse    schedule 13.11.2015    source источник


Ответы (1)


Я думаю, основная причина, по которой они не распределяются должным образом, заключается в том, что SOA не является переменной-фактором, вы должны оставить его фактором. Кроме того, если вы пропустите scale_x_continuous, ваш код должен работать. Вот как я это сделал с небольшими изменениями. Вы можете настроить вертикальное расстояние (vjust) и цвет так, как вам нравится:

library(tidyr)
library(grid)
library(ggplot2)

data = read.table('temp.dat', header=T)
data <- gather(data, SOA, RT, X0:X1000)
data$ResponseCondition = as.factor(data$ResponseCondition)
levels(data$SOA) = c(0,250,500,1000)
# data$SOA = as.numeric(as.character(data$SOA))

p = ggplot(data, aes(y=RT, x=SOA, fill=ResponseCondition, ymax=RT*1.05))
p = p + geom_bar(stat='identity', position=position_dodge())
p = p + geom_text(aes(label=RT), colour="purple", vjust=1.5, position=position_dodge(0.9), size=4)

# p = p + scale_x_continuous(breaks=c(0,250,500,1000))

p = p + ylab('Response Time (ms)')
p = p + xlab('Precue Interval (ms)')
p = p + theme_bw()
p = p + scale_fill_grey(start = 0.1, end = .9, name='Response condition')

p = p + theme(
    axis.title.x = element_text(vjust=-0.30, size=10),
    axis.title.y = element_text(vjust=1.50, size=10),
    text = element_text(size=10),
    legend.justification=c(1,1), legend.position=c(1,1),
    plot.margin = unit(rep(.5, 4), 'cm'))

ggsave('temp.png', width=10, height=7.5)
person S. Elzwawi    schedule 14.11.2015
comment
Это исправило это, и теперь будет работать, спасибо! Мне любопытно, однако: знаете ли вы, как решить проблему, сохраняя непрерывный масштаб? Я знаю, что необычно использовать непрерывную шкалу по оси x для гистограммы, но иногда это может быть полезно для пояснения. - person Doug Morse; 14.11.2015
comment
Извините, до сих пор мне не удавалось найти способ, позволяющий использовать непрерывную шкалу для категориальной переменной x без проблем с метками в таких случаях. Если вы придумали какой-нибудь трюк, пожалуйста, опубликуйте его здесь! - person S. Elzwawi; 15.11.2015