Как сделать так, чтобы легенда ggplot точно отражала внешний вид баров

У меня есть график ggplot с сгруппированными барами. Существует 4 столбца на значение x, а заливка, цвет и альфа-диапазон определяются переменными в данных. Я бы хотел, чтобы моя легенда точно отражала вид баров на сюжете. К сожалению, у меня недостаточно репутации, чтобы опубликовать фотографию моего сюжета, но вот мой код:

ggplot(all_frame_freq, aes(x = Frame, y = prop_type, group = interaction(speaker,Type), fill = Type, color = Type, alpha = speaker)) +  
  geom_bar(position = "dodge", stat="identity") +
  scale_fill_manual(values = c("#E41A1C","#377EB8"), name="Type", labels=c("A","B")) +
  scale_color_manual(values = c("#E41A1C","#377EB8"), guide=FALSE) +
  scale_alpha_manual(values = c(.2, 1), name="speaker", labels=c("1", "2"))

Это создает линию вокруг всех столбцов, но линия показывает только вокруг столбцов, где альфа <1. Таким образом, график проявляется в виде светлых полос с контуром и темных полос без контура. (Мне показалось, что это легче смотреть, чем просто светлые и темные полосы.) Мне бы хотелось, чтобы легенда отражала это, чтобы поле легенды для динамика 1 отображалось с контуром, похожим на соответствующие полосы. Но в настоящее время в легенде динамика только бледно-серый прямоугольник для 1 и темно-серый прямоугольник для 2, и я не могу понять, как добавить линию вокруг светло-серого прямоугольника. Есть ли способ сделать это? Самое близкое, что я получил, было добавить

theme(legend.key = element_rect(color = 'black', size = 0.5))

но это добавляет линию вокруг всех полей легенды. Есть ли способ добавить его только к одному блоку в альфа-легенде или (возможно, проще) просто к альфа-легенде, где я мог бы установить цвет линии в соответствии с более темным блоком? Я довольно долго пробовал разные методы и искал идеи, но пока не нашел правильного решения.

Образец моих данных - на этот раз правильно отформатированный:

structure(list(Type = structure(c(1L, 1L, 2L, 2L, 1L, 1L, 2L, 
2L), .Label = c("A", "B"), class = "factor"), Frame = structure(c(1L, 
2L, 1L, 2L, 1L, 2L, 1L, 2L), .Label = c("V CP", "V NP"), class = "factor"), 
prop_type = c(0.209513024, 0.138731597, 0.017167382, 0.387528402, 
0.437998087, 0.144086707, 0.042695836, 0.398376853), speaker = structure(c(1L, 
1L, 2L, 2L, 1L, 1L, 2L, 2L), .Label = c("Speaker1", "Speaker2"
), class = "factor")), .Names = c("Type", "Frame", "prop_type", 
"speaker"), class = "data.frame", row.names = c(NA, -8L))

1 ответ

Решение

[C] срочно в легенде говорящего просто отображается бледно-серая рамка для 1 и темно-серая рамка для 2, и я не могу понять, как добавить линию вокруг светло-серой рамки.

Вы могли бы сделать

ggplot(all_frame_freq, aes(x = Frame, y = prop_type, group = interaction(speaker,Type), fill = Type, color = Type, alpha = speaker)) +  
  geom_bar(position = "dodge", stat="identity") +
  scale_fill_manual(values = c("#E41A1C","#377EB8"), name="Type", labels=c("A","B")) +
  scale_color_manual(values = c("#E41A1C","#377EB8"), guide=FALSE) +
  scale_alpha_manual(values = c(.2, 1), name="speaker", labels=c("1", "2")) + 
  guides(alpha = guide_legend(override.aes = list(color = c("red", NA))))

введите описание изображения здесь

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