ggplot2: как объединить слои geom_line и geom_point с планками погрешностей

Я пытаюсь создать линейный график четырех условий данных, отображая среднее значение каждого условия как функцию времени. Условия различаются в дизайне 2x2, поэтому я использовал geom_line (синие/красные линии, сплошные/пунктирные) и geom_point (синие/красные фигуры, которые являются квадратами/кругами) для построения данных. Это прекрасно работает, когда я использую слои, но я также хотел бы включать полосы ошибок в каждый момент времени:

pd <- position_dodge(.1)
ggplot(data = df) +
  geom_line(data=subset(df, condition == "A"), aes(E, avg),
        colour="red", size=1) +
  geom_point(data=subset(df, condition == "A"), aes(E, avg), 
         colour="red", shape=24, fill="white", size=5) +
  geom_line(data=subset(df, condition == "B"), aes(E, avg),
        colour="red", linetype="dashed",size=1) +
  geom_point(data=subset(df, condition == "B"), aes(E, avg), 
         colour="red", shape=24, fill="red", size=5) +
  geom_line(data=subset(df, condition == "C"), aes(E, avg),
        colour="blue", size=1) +
  geom_point(data=subset(df, condition == "C"), aes(E, avg), 
         colour="blue", shape=21, fill="white", size=5) +
  geom_line(data=subset(df, condition == "D"), aes(E, avg),
        colour="blue", linetype="dashed",size=1) +
  geom_point(data=subset(df, condition == "D"), aes(E, avg), 
         colour="blue", shape=21, fill="blue", size=5)

Приведенный выше код работает нормально. Но если я добавлю в эту строку:

+ geom_errorbar(aes(x=E, ymin=avg-se, ymax=avg+se), width=.1, position=pd)

На графике не учитывается pd (которое было определено ранее), а столбцы трудно отличить друг от друга (т. е. они перекрываются). Как это исправить?


person ucsbcoding    schedule 12.03.2015    source источник
comment
Сообщение об ошибке кажется довольно ясным: вы не определяете x в своем вызове aes.   -  person shadow    schedule 12.03.2015
comment
Я запутался - разве код, который я вставил, не определяет x в вызове aes как y=min=avg-se, ymax=avg+se ?   -  person ucsbcoding    schedule 12.03.2015
comment
похоже, вы хотите что-то вроде aes(x=E, ymin=avg-se, ymax=avg+se)   -  person shadow    schedule 12.03.2015
comment
Спасибо за быстрый ответ! Этот код добавляет полосы ошибок, но переопределяет аргументы, которые немного отделяют полосы ошибок, чтобы различать их. Есть ли способ добавить это обратно?   -  person ucsbcoding    schedule 12.03.2015
comment
Прошу прощения за некоторую путаницу, так как я пытался сформулировать свой вопрос в краткой форме. Очевидно, я должен был упомянуть, что более ранний код, который я не вставил в этот вопрос, определил pd, который я теперь отредактировал, чтобы включить в вопрос. Таким образом, несмотря на то, что pd определен ранее, ваш предложенный код, по-видимому, не учитывает pd, и полосы перекрываются. Если у вас есть предложения, как исправить это, я был бы признателен, а также признателен за вашу помощь до сих пор.   -  person ucsbcoding    schedule 12.03.2015


Ответы (1)


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

# sample data 
df <- data.frame(condition = rep(LETTERS[1:4], each = 5), 
                 E = rep(1:5, times = 4), 
                 avg = rnorm(20), 
                 se = .3)
# plotting command
ggplot(data = df, aes(x = E, 
                      y = avg, 
                      color = condition, 
                      linetype = condition, 
                      shape = condition, 
                      fill = condition)) +
  geom_line(size=1) + 
  geom_point(size=5) +
  scale_color_manual(values = c(A = "red", B = "red", C = "blue", D = "blue"), 
                     guide = "none") +
  scale_linetype_manual(values = c(A = "solid", B = "dashed", C = "solid", D = "dashed"), 
                        guide = "none") +
  scale_shape_manual(values = c(A = 24, B = 24, C = 21, D = 21), 
                     guide = "none") +
  scale_fill_manual(values = c(A = "white", B = "red", C = "white", D = "blue"), 
                    guide = "none") +
  geom_errorbar(aes(x = E, ymin = avg-se, ymax = avg+se, color = NULL, linetype = NULL), 
                width=.1, position=position_dodge(width = .1))
person shadow    schedule 12.03.2015
comment
Спасибо за вашу помощь! - person ucsbcoding; 12.03.2015