2016-12-01 3 views
1

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

Взгляните на следующий пример кода (случайные данные, но прекрасно подходит для демонстрации того, что я хочу):

require(dplyr) 
require(RColorBrewer) 

col <- brewer.pal(3, "Spectral") 

a <- data.frame(multiplier = c(0.5, 0.7, 1.0), multiplier2 = c(0.3, 0.1), random = runif(3 * 500)) 
a$result = a$multiplier * a$random * runif(length(a$random)) * a$multiplier2 

a_grouped_by_multiplier = group_by(a, multiplier) 
means = summarise(a_grouped_by_multiplier, mean_rand = mean(random), mean_res = mean(result)) 

ggplot(a, aes(x = random, y = result)) + 
    geom_density2d(bins = 20) + 
    geom_point(aes(color = factor(multiplier2)), size = 0.7) + 
    geom_vline(data = means, aes(xintercept = mean_rand), color = "orange", linetype = "solid", size = 1.5, show.legend = TRUE) + 
    geom_hline(data = means, aes(yintercept = mean_res), color = "red", linetype = "dashed", size = 1.5, show.legend = TRUE) + 
    scale_color_manual(name = "Values", values = c(col[1], col[2]), labels = c("* 0.1", "* 0.3")) + 
    facet_grid(~ multiplier) + 
    theme(panel.grid.major = element_line(colour = "white", linetype = "dashed", size = 0.3), 
     panel.grid.minor = element_blank(), 
     panel.background = element_rect(fill = "#555555"), 
     legend.key = element_rect(fill = "#555555")) 

Это создает следующий сюжет:

enter image description here

Я попытался для настройки бесконечных параметров для получения желаемого результата. Используется все различные scale_*_manual функции с различными параметрами, использовали show.legends = FALSE, попробовал guide() функцию с различными guide_legend() параметрами, я попытался не сделать color, linetype, size и т.д. параметры часть эстетики (один за другим, и все вместе взятых), но ничего до сих пор работал для создания легенды, как следующее (созданный Inkscape здесь):

enter image description here

Моя первая проблема заключается в том, что я не могу получить две легенды группы: одна для «ценностей» и один для «средних ». Вторая проблема заключается в том, что из-за geom_hline и geom_vline вертикальные и горизонтальные линии появляются во всех коробках легенд. Обратите внимание, что я также использую другой фрейм данных для geom_hline и geom_vline.

+0

Короткий ответ нет, ggplot легенды неразрывно связаны с эстетикой. Тем не менее, они очень настраиваемые. В этом случае вам нужно найти способ сделать средние значения эстетическими, возможно, создав фиктивный файл data.frame и используя 'geom_abline'. – alistaire

ответ

2

Мне удалось построить то, что я хотел, но уродливо, когда дело доходит до кодирования. Вкратце, я добавил разные эстетики, пока не получил как минимум две группы легенд с нужным количеством элементов и фигур. Затем я использовал функции scale_*_manual и функцию guide(), чтобы переопределить некоторые эстетики и сделать легенду почти такой, какой она есть (до сих пор мне не удавалось иметь вертикальную линию в окне легенды).

Код следующее:

ggplot(a, aes(x = random, y = result)) + 
    geom_density2d(bins = 20) + 
    geom_point(aes(color = factor(multiplier2), shape = factor(multiplier2), fill = factor(multiplier2)), stroke = 0.01, size = 2.5) + 
    geom_vline(data = means, aes(xintercept = mean_rand, color = "mean_rand", size = "mean_rand"), show.legend = FALSE) + 
    geom_hline(data = means, aes(yintercept = mean_res, color = "mean_res", size = "mean_res"), linetype = 12, show.legend = FALSE) + 
    scale_color_manual(values = c(col[1], col[2], "orange", "red")) +        # Provides the desired colors for the plot 
    scale_shape_manual(name = "Values", values = c(21, 22), labels = c("*0.1", "*0.3")) +   # Provides the desired shape and plots the "Values" legend 
    scale_fill_manual(name = "Values", values = c(col[1], col[2]), labels = c("*0.1", "*0.3")) + # Provides the fill for the shapes and merges the legend with the shape ("Values") legend 
    scale_size_manual(name = "Averages", values = c(1.5, 1.5), labels = c("Random", "Result")) + # Provides a legend for the Averages but looks ugly..... 
    guides(color = FALSE, # Hides the "color" legend because it has 4 values and we don't want that. 
     shape = guide_legend(order = 1), # Forces the "Values" legend group to be on top 
     fill = guide_legend(order = 1), # Forces the "Values" legend group to be on top 
     size = guide_legend(order = 2, override.aes = list(linetype = c(1, 12), color = c("orange", "red")))) + # Makes the "Average" legend to look as it should, by overriding the aesthetics 
    facet_grid(~ multiplier) + 
    theme_dark() + 
    theme(panel.grid.major = element_line(colour = "white", linetype = "dashed", size = 0.2), 
     panel.background = element_rect(fill = "#555555"), 
     legend.key = element_rect(fill = "#555555")) 

И вот как результат выглядит следующим образом:

enter image description here

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