Подтвердить что ты не робот

Почему легенда ggplot2 не сочетает значения ручной заливки и масштабирования?

Ожидаемое поведение

Если бы я создал график с помощью ggplot2 и использовал бы отдельные, скажем, шкалы формы и заливки для разграничения данных, я ожидал бы, что легенда проведет разграничение между "белыми" заполненными точками (которые выглядят пустыми) и "черными" заполненными точками (которые не выглядят полые).

В приведенном ниже примере кода элемент легенды для Windows должен быть белой полой точкой, а для Linux - точкой, заполненной черным

Фактическое поведение

Элементы условных обозначений в разделе "Операционная система" отображают две визуально идентичные точки для явно разных операционных систем, точки которых четко обозначены различными заливками на графике. В приведенном ниже примере кода и легенда, и Windows, и Linux представлены в виде неразличимых черных полых точек в легенде, даже если они правильно нанесены на график по-разному.

Образец участка

Sample plot with broken fill behavior in the legend

Пример кода

library(ggplot2)

x <- rnorm(n = 30)
y <- rnorm(n = 30)
treatment <- rep(c("red", "green", "blue"), times = 20)
operatingSystem <- rep(c("Windows", "Linux"), times = 30)

dd <- data.frame(x, y, treatment, operatingSystem)

fillScaleValues <- c(
  "Windows" = "white",
  "Linux" = "black"
)

shapeScaleValues <- c(
  "red" = 21,
  "green" = 22,
  "blue" = 23
)

p <- ggplot(
      aes(x = x, 
          y = y,
          shape = factor(treatment),
          fill = factor(operatingSystem)
      ), data = dd
     )

p <- p + geom_point()
p <- p + scale_fill_manual(values = fillScaleValues, name = "Operating System")
p <- p + scale_shape_manual(values = shapeScaleValues, name = "Treatment")

p

Информация о сеансе

R version 2.15.1 (2012-06-22)
Platform: x86_64-apple-darwin9.8.0/x86_64 (64-bit)

locale:
[1] C/en_US.UTF-8/C/C/C/C

attached base packages:
[1] stats     graphics  grDevices utils     datasets  methods   base     

other attached packages:
[1] ggplot2_0.9.2.1       reshape2_1.2.1        plyr_1.7.1            ProjectTemplate_0.4-2
[5] testthat_0.7         

loaded via a namespace (and not attached):
 [1] MASS_7.3-21        RColorBrewer_1.0-5 colorspace_1.1-1   dichromat_1.2-4   
 [5] digest_0.5.2       evaluate_0.4.2     grid_2.15.1        gtable_0.1.1      
 [9] labeling_0.1       memoise_0.1        munsell_0.4        proto_0.3-9.2     
[13] scales_0.2.2       stringr_0.6.1      tools_2.15.1      
4b9b3361

Ответ 1

Вы должны переопределить форму, которая используется в легенде, как показано в этом вопросе.

Итак, используя ваш примерный код (спасибо за ясный, воспроизводимый вопрос, кстати), вам нужно всего лишь:

p + guides(fill = guide_legend(override.aes = list(shape = 21)))

Что дает вам то, что вы хотели:

Proper legend