ggplot2, как получить 2 гистограммы со значением у = для подсчета единицы / суммы подсчета обоих

Я думаю, мой вопрос прост (даже если название не...), но я не смог найти четкого ответа. Я хочу построить гистограммы времени реакции в психофизическом задании. Мне нужно изобразить два из них на одном рисунке: один для правильных ответов, другой для неправильных ответов.

Я не хочу наносить на график абсолютные значения, а скорее относительную пропорцию, соответствующую:

Для правильных ответов: count(correct==1) / sum(count(correct==1) + count(correct==0))

За неправильные ответы: count(correct==0) / sum(count(correct==1) + count(correct==0))

На данный момент у меня есть это:

ggplot(data, aes(x=RT, color=correct)) 
    + geom_histogram(aes(y = ..count../sum(..count..))) 
    + stat_bin(breaks = seq(5,800,by=10))

Но я не уверен, что он делает то, что я хочу (соответствует ли сумма как правильных, так и неправильных ответов?). Я не чувствую себя комфортно с..count... и т.д., кто-нибудь будет иметь хорошую рекомендацию для документации об этом аспекте?

Заранее спасибо.

Редактировать: входные данные:

df <- structure(list(RT = c(359L, 214L, 219L, 206L, 120L, 166L, 156L, 
       181L, 135L, 122L, 110L, 101L, 139L, 215L, 106L, 217L, 162L, 135L, 
       114L, 205L), correct = c(1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 
       1L, 1L, 1L, 0L, 1L, 1L, 1L, 0L, 1L, 0L, 0L)), .Names = c("RT", 
       "correct"), class = "data.frame", row.names = c(NA, -20L))

Вот ссылка на график, который я сделал ранее, используя базу R, и это именно тот результат, который я хочу получить в конце. https://www.dropbox.com/s/nqn83pkoq7o0stv/RTexample.png Это линии (но основанные на гистограммах, желтый для правильного ==1, синий для правильного ==0). Особенность, которую я хочу, состоит в том, чтобы обе строки суммировали до 1.

2 ответа

Решение

Шора,

Брайан Хэнсон абсолютно прав. Вы действительно должны прекратить пытаться выполнить ваше преобразование как часть функции 'ggplot'. Я знаю, что это заманчиво, но методы преобразования в графике "ggplot" следует использовать больше для исследования данных, а не для создания заранее определенного графика. Вы можете быстро использовать функцию 'Hist', чтобы получить необходимые данные, преобразовать данные и затем передать их в "ggplot" для фактического построения графика. Лучшая часть преобразования ваших данных вручную состоит в том, что вы можете увидеть все это в действии, и у вас не будет проблем (как в вашем вопросе), угадывающих, верны ли ответы.

Вам нужно будет решить, как именно вы хотите расположить два графика, но все это можно сделать с помощью ggplot. Вот пример внешнего преобразования:

Шаг 1: Получить значения гистограммы для [правильного]=1.

correct_Hist <- hist(data[correct==1, 1], breaks=seq(5, 800, by=10), plot=FALSE)

Шаг 2: Получить значения гистограммы для [правильного]=0.

incorrect_Hist <- hist(data[correct==0, 1], breaks=seq(5, 800, by=10), plot=FALSE)

Шаг 3: Преобразование счета. Ваше объяснение в вопросе немного двусмысленно, и может быть воспринято несколькими разными способами. Для этого ответа я предполагаю, что вам нужна не гистограмма, а скорее гистограмма, показывающая, какой процент определенного диапазона значений RT представлен неправильными или правильными ответами. Это довольно просто сейчас, когда у нас есть счет.

correct_Bar_Values <- correct_Hist$counts / (correct_Hist$counts + incorrect_Hist$counts)
incorrect_Bar_Values <- incorrect_Hist$counts / (correct_Hist$counts + incorrect_Hist$counts)

Шаг 4: подготовьте его так, как вам нравится. Теперь, когда у вас есть исходные значения, которые вы хотите построить, вы можете использовать любые методы для их построения. Я рекомендую слой 'geom_bar', а не слой 'geom_hist', так как вы уже сделали вычисления. Вам также нужно будет указать два разных вида сетки, которые вы хотите использовать для ggplot, но если вам нужна помощь, задайте второй вопрос. Вот как вы можете быстро превратить ваши данные в гистограмму:

# The percentage of answers that were not correct
qplot(incorrect_Hist$mids,y=incorrect_Bar_Values, geom="bar", stat="identity", ylim=c(0,1))

# The percentage of answers that were correct
qplot(correct_Hist$mids,y=correct_Bar_Values, geom="bar", stat="identity", ylim=c(0,1))

Если я правильно понимаю, position="fill" должны соответствовать вашим потребностям:

ggplot(df,aes(x=RT,fill=factor(correct,labels=c("Incorrect","Correct")))) +
 geom_bar(breaks=seq(5,800,by=10),position="fill") +
  scale_y_continuous("",labels=percent) + scale_fill_discrete("")

Одна гистограмма основана (нулевой уровень) внизу, а другая сверху.

Другие вопросы по тегам