2017-01-17 5 views
0

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

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)) 
+2

Вы знаете, у нас нет данных all_frame_freq поэтому мы не можем воссоздать свою фотографию. Пожалуйста, покажите нам данные, набрав 'dput (all_frame_freq)' и вставив вывод в ваш вопрос – G5W

+0

My bad - только что добавил. – Ed2122

+0

Просьба представить воспроизводимый пример, «добавленные данные» не воспроизводятся. Для получения справки см. [Здесь] (http://stackoverflow.com/questions/5963269/how-to-make-a-great-r-reproducible-example). –

ответ

1

[C] urrently легенда динамик просто показывает, бледно-серый ящик для 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)))) 

enter image description here

+0

Это работает именно так, как мне нужно, если я задаю цвет черным, а не красным. (Кроме того, у моего сюжета нет штабелированных баров, но это не имеет значения.) В какой-то момент я попытался переопределить.aes, но не смог понять правильный синтаксис. Благодаря! – Ed2122

Смежные вопросы