Как извлечь цвета заливки из объекта ggplot?

Я пытаюсь написать несколько автоматических модульных тестов для ряда функций, которые генерируют ggplotграфику.

Например, я хочу установить для графика определенную цветовую шкалу. Теперь мне нужен способ определить, действительно ли была применена правильная цветовая шкала.

Фон:

Вот пример кода, который устанавливает цвет fillдля использования палитры ColourBrewerDark2:

p <- ggplot(mtcars, aes(x=factor(cyl), y=mpg, fill=factor(gear))) + 
  geom_bar(stat="identity") + 
  facet_grid(~gear) +
  scale_fill_brewer(palette="Dark2")

print(p)

enter image description here

Итак, визуальный осмотр говорит мне, что код сработал.

Что я пробовал:

Теперь я хочу убедиться в этом, осмотрев объект:

str(p, max.level=1)
List of 8
 $ data       :'data.frame':    32 obs. of  11 variables:
 $ layers     :List of 1
 $ scales     :Reference class 'Scales' [package "ggplot2"] with 1 fields
 ..and 20 methods, of which 9 are possibly relevant
 $ mapping    :List of 3
 $ options    :List of 1
 $ coordinates:List of 1
 ..- attr(*, "class")= chr [1:2] "cartesian" "coord"
 $ facet      :List of 9
 ..- attr(*, "class")= chr [1:2] "grid" "facet"
 $ plot_env   :<environment: R_GlobalEnv> 
 - attr(*, "class")= chr "ggplot"

Хорошо, объект $scalesкажется интересным. Давайте рассмотрим это подробнее:

str(p$scales)
Reference class 'Scales' [package "ggplot2"] with 1 fields
 $ scales:List of 1
 ..$ :List of 14
 ....$ call      : language discrete_scale(aesthetics = "fill", scale_name = "brewer", palette = brewer_pal(type, palette))
 ....$ aesthetics: chr "fill"
 ....$ scale_name: chr "brewer"
 ....$ palette   :function (n)  
 ....$ range     :Reference class 'DiscreteRange' [package "scales"] with 1 fields
 ......$ range: NULL
 ......and 14 methods, of which 3 are possibly relevant:
 ......  initialize, reset, train
 ....$ limits    : NULL
 ....$ na.value  : logi NA
 ....$ expand    : list()
 ......- attr(*, "class")= chr "waiver"
 ....$ name      : NULL
 ....$ breaks    : list()
 ......- attr(*, "class")= chr "waiver"
 ....$ labels    : list()
 ......- attr(*, "class")= chr "waiver"
 ....$ legend    : NULL
 ....$ drop      : logi TRUE
 ....$ guide     : chr "legend"
 ....- attr(*, "class")= chr [1:3] "brewer" "discrete" "scale"
 and 20 methods, of which 9 are possibly relevant:
   add, clone, find, get_scales, has_scale, initialize, input, n, non_position_scales

Но здесь я рисую пробел. Внутри p$scalesнет ничего, что выглядело бы либо как мой ввод palette, ни на самом деле как цвета.

Что я ожидаю найти:

Цвета, которые я ожидаю, это:

library(RColorBrewer)
brewer.pal(3, name="Dark2")
[1] "#1B9E77" "#D95F02" "#7570B3"

Вопрос:

Как запросить объект ggplotдля использования определенных цветов заливки?

46
задан Andrie 2 August 2012 в 09:04
поделиться