Удаление символов stat_summary из категорий легенд в ggplot2

У меня есть следующий код, который создал два сюжета для скрипки:

ggplot(both,aes(x=levelsname,y=loginc,fill=levelsname))+
geom_violin() +
  stat_summary(fun.y = mean,
               aes(shape="Mean"),
               colour='black',
               geom="point",
               size=3)+
    scale_shape_manual("Summary Statistics", values=c("Mean"="+"))+  
  scale_fill_manual(values=c('gray70','orange','red'))+
  scale_x_discrete(name="Site Category")+
  scale_y_continuous(name = "Log(Incidence/100,000")+
  guides(fill=guide_legend(title = "Site Category"))+
  facet_grid(~ANA)+
  theme_classic()+
  theme(axis.text.x=element_blank())

Скрипичный сюжет

Для этих сюжетов все правильно, кроме легенды. Я пытаюсь удалить черные кружки из легенды в категории сайта и заменить их символом +. Я также хотел бы переместить символы легенды + и среднего под элементами легенды категории сайта, чтобы они выглядели как одна легенда.


person geoscience123    schedule 12.03.2020    source источник
comment
Добавьте show.legend = FALSE к вызову статистики   -  person camille    schedule 12.03.2020
comment
Скорее всего дурак. Удалить легенду ggplot 2.2   -  person tjebo    schedule 12.03.2020
comment
@camille Добавление show.legend=FALSE удаляет кружок внутри легенды категории сайта, но также удаляет среднее значение из легенды.   -  person geoscience123    schedule 12.03.2020
comment
О, понял. Вы можете использовать override.aes для определенного типа легенды, в данном случае для легенды заполнения. Похоже, что этот пост должен вас охватить, и это тоже может помочь   -  person camille    schedule 12.03.2020
comment
@Tjebo, они не хотят удалять целые легенды, о чем этот пост.   -  person camille    schedule 12.03.2020
comment
@камилла фэйр. Был просто двухсекундный гугл, потому что это, скорее всего, обман. хотя может это не лучший выбор   -  person tjebo    schedule 12.03.2020


Ответы (1)


У вас не должно быть shape="Mean" в вызове aes. Это не эстетическое отображение! Наличие его в aes заставляет ggplot думать, что вы устанавливаете shape для сопоставления с символьной переменной, которая всегда принимает значение "mean". Отсюда и странная легенда.

Вы можете просто использовать shape="+" в качестве аргумента в вызове stat_summary, чтобы получить желаемый эффект. Вам, вероятно, придется также убрать линию scale_shape_manual("Summary Statistics", values=c("Mean"="+")), потому что шкалы формы больше нет.

Чтобы ответить на последнюю часть вашего вопроса, если вы хотите иметь отдельную строку «среднее» для своей легенды, вы можете добавить дополнительный уровень «Среднее» к переменной, сопоставленной с эстетикой fill (затем вручную сделать заливку прозрачной). Смотри ниже:

d <- data.frame(x=factor(c(1,2)), y=rnorm(100))

ggplot(d, aes(x,y, group=x, fill=x)) + 
   geom_violin() + 
   stat_summary(shape="+", fun="mean", aes(fill="Mean"), geom="point", size=3) +
   scale_fill_manual(values=c("blue", "red", "#00000000"), limits=c(1,2,"Mean"))

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

Редактировать: я нашел способ избавиться от рамки вокруг + в средней строке легенды, но это ужасный хак. Вам нужно два слоя stat_summary, один с color прозрачным с эстетическим отображением (чтобы поле легенды было прозрачным, но это делает легенду «+» также прозрачной), а затем второй с color="black" непосредственно, который заменяет «+» в легенда, но не коробка.

ggplot(d, aes(x,y, group=x, fill=x, color=x)) + 
   geom_violin() + 
   stat_summary(shape="+", fun="mean", aes(fill="Mean",color="Mean"), geom="point", size=3)+
   stat_summary(shape="+", fun="mean",color="black", geom="point", size=3) +
   theme_classic() + 
   scale_fill_manual(values=c("lightblue", "red", "#00000000"), limits=c(1,2,"Mean"))+  
   scale_color_manual(values=c("black", "black", "#00000000"), limits=c(1,2,"Mean"))

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

person George Savva    schedule 12.03.2020
comment
Кажется, это работает, единственная проблема, с которой я сталкиваюсь, заключается в том, что моя легенда автоматически упорядочивается в алфавитном порядке, в результате чего среднее помещается в центр моей легенды и отбрасывается цветовая шкала. - person geoscience123; 13.03.2020
comment
@ coconn41 извиняюсь, я не подумал об этом ... вам нужно будет установить уровни порядка в слое scale_fill_manual. Я обновлю свой ответ .. - person George Savva; 13.03.2020
comment
@ coconn41 coconn41 Я отредактировал, если среднее значение не является последним в алфавитном порядке, вам нужно установить порядок уровней в опции limits() для каждой шкалы. - person George Savva; 13.03.2020