2015-11-13 2 views
1

Я пытаюсь добавить метки к довольно простой гистограмме (т. Е. Geom_bar). position_dodge() в пределах geom_text() корректирует вертикальное расстояние между метками, но не горизонтальное расстояние. Как я могу получить ggplot2, чтобы правильно разогнать мои надписи?Как добавить горизонтальное уклонение от ярлыков в гистограмме 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) 

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

Bar chart

Вот содержание 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 

ответ

0

Я думаю, главная причина почему они не распределены должным образом, так это то, что 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) 
+0

Это исправлено и будет работать сейчас, спасибо! Мне любопытно, однако: знаете ли вы, как исправить проблему при сохранении непрерывного масштаба? Я знаю, что необычно использовать непрерывную шкалу по оси X для гистограммы, но иногда это может быть полезно для пояснения. –

+0

К сожалению, до сих пор мне не удалось найти способ, который позволяет использовать непрерывную шкалу для категориальной x-переменной без проблем с ярлыками в таких случаях. Если вам посчастливилось придумать трюк, пожалуйста, разместите его здесь! –