r (линейный график ggplot2): изменение типа линии для полос погрешностей изменяет их в легенде

У меня есть линейный график, подобный этому: график

df <- data.frame(x = c(1,1,2,2,1,1,2,2), 
  y = c(1.5,1.9,2.1,1.6,1.4,1.8,2.0,1.7), 
  error = c(0.2), 
  group = c("g1","g2","g1","g2","g3","g4","g3","g4"))

ggplot(df, aes(x = x, y = y, color = group, linetype = group)) + 
  geom_point() + geom_line() + 
  geom_errorbar(aes(ymin = y - error, ymax = y + error),
                linetype = 1, width = 0.5,                                 
                position = position_dodge(width = 0.2)) +
  scale_color_manual(values = c("g1"="Black", "g2"="Grey", "g3"="Black", "g4"="Grey")) +
  scale_linetype_manual(values=c("g1"=1,"g2"=1,"g3"=2,"g4"=2))

Мне нужно сделать его черно-белым, поэтому с несколькими группами я использовал как color, так и linetype. Когда я меняю тип линии, я хочу, чтобы полосы погрешностей были сплошными, хотя линии были пунктирными, поэтому я переопределяю тип линии для полос погрешностей. По какой-то причине это также меняет легенду, поэтому уже не ясно, какая строка какая.

Я знаю, что это каким-то образом зависит от color = group в aes, потому что, когда у меня был только тип линии, легенда была в порядке. По какой-то причине я просто не могу найти способ сделать линии, цвета и сплошные погрешности одновременно. Кто-нибудь знает, почему это так?


person RandomMonitor    schedule 14.08.2015    source источник


Ответы (1)


Попробуй это:

    ggplot(df, aes(x = x, y = y, colour = group, group = group)) + 
  geom_line(aes(y=y,linetype = group)) +
  geom_point()+
  geom_errorbar(aes(ymin = y - error, ymax = y + error),
                colour = rep(c("black","grey"),4),
                width = 0.1,                                 
                position = "dodge") +
  scale_color_manual(values = c("g1"="Black", "g2"="Grey", "g3"="Black", "g4"="Grey")) +
  scale_linetype_manual(values=c("g1"=1,"g2"=1,"g3"=2,"g4"=2))

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

Установка цветов путем создания столбца:

df <- data.frame(x = c(1,1,2,2,1,1,2,2), 
                 y = c(1.5,1.9,2.1,1.6,1.4,1.8,2.0,1.7), 
                 error = c(0.2), 
                 group = c("g1","g2","g1","g2","g3","g4","g3","g4"))


df$group_cols = "black"
df$group_cols[df$group %in% c("g2","g4")] = "grey"


ggplot(df, aes(x = x, y = y, colour = group, group = group)) + 
  geom_line(aes(y=y,linetype = group)) +
  geom_point()+
  geom_errorbar(aes(ymin = y - error, ymax = y + error),
                colour = df$group_cols,
                width = 0.1,                                 
                position = "dodge") +
  scale_color_manual(values = c("g1"="Black", "g2"="Grey", "g3"="Black", "g4"="Grey")) +
  scale_linetype_manual(values=c("g1"=1,"g2"=1,"g3"=2,"g4"=2))
person AntoniosK    schedule 14.08.2015
comment
Спасибо! Это работает в данных примера, но по какой-то причине добавление color к полосе ошибок удаляет уклонение в моих реальных данных. В реальных данных 48 точек вместо 8 и названия немного другие, но в остальном разницы не нахожу. geom_errorbar(aes(ymin=mean-groupCI, ymax=mean+groupCI), colour=c(rep(c("grey","black","black","grey"),12)), width = .2, position=position_dodge(width=0.2)) + (извините за форматирование, как мне показать код в комментарии?) Я пробовал ваш более простой position="dodge", но это было не то. - person RandomMonitor; 14.08.2015
comment
Кроме того, знаете ли вы, в чем причина такого поведения? Когда определение цвета отсутствует в geom_errorbar, легенда отображается неправильно - почему определение полосы ошибок изменяет легенду? - person RandomMonitor; 14.08.2015
comment
color = c(rep(c(black,grey),4)) работает, потому что в данных примера группа df$g1 g2 g1 g2 g3 g4 g3 g4. Порядок здесь имеет значение, так как это ручная настройка. Проверьте порядок в большом наборе данных. Соответствует ли это color=c(rep(c(grey,black,black,grey),12)) ? Если нет, попробуйте создать столбец df$group_cols и сделать его черным, если df$group равен g1 или g3, и серым в противном случае. - person AntoniosK; 14.08.2015
comment
Извините, я был неясен. Цвета в порядке после моего изменения, которое вы видели там, я понял, что порядок имеет значение. Но уклонение больше не работает после добавления настройки цвета. - person RandomMonitor; 14.08.2015
comment
Это не должно быть возможно. Наличие большего количества групп не должно влиять на уклонение. Есть ли шанс, что вы добавили что-то еще в свой код? тип линии в другом месте может быть? - person AntoniosK; 14.08.2015
comment
Только что исправил кое-что, так как c(rep(c(черный,серый),4)) такой же, как rep(c(черный,серый),4) - person AntoniosK; 14.08.2015
comment
...Ладно, я не знаю, что случилось, но сегодня я проверил, и в какой-то момент что-то произошло, и уклонение теперь работает. Я тестировал несколько разных вещей, и в какой-то момент position(width=0.2) не работало, но когда я изменил его, увернулся, а затем снова, вдруг это сработало. И более того, даже старый код, который не работал, когда я его использовал, теперь запускается из истории, тоже работает! - person RandomMonitor; 18.08.2015
comment
Теперь, когда я об этом думаю, я сохранил ggplot(...) в переменной, а затем использовал переменную вместо всего определения. У меня, должно быть, было старое определение в этой переменной, и оно, вероятно, было исправлено, когда я, наконец, запустил новое определение, следуя вашему примеру. Я думал, что изменил переменную при первом тестировании вашего решения, но, полагаю, я этого не сделал, потому что не могу понять, что еще это могло быть. Спасибо, в любом случае. Отмечаем ваше решение как принятое. - person RandomMonitor; 18.08.2015