Ответ 1
Попробуйте построить сюжет,
g <- ggplot_build(p)
unique(g$data[[1]]["fill"])
fill
1 #1B9E77
16 #D95F02
28 #7570B3
Я пытаюсь написать несколько автоматических модульных тестов для ряда функций, которые генерируют графику ggplot
.
Например, я хочу установить конкретную цветовую гамму на график. Теперь мне нужен способ определить, действительно ли была применена правильная цветовая шкала.
Вот пример кода, который устанавливает цвет fill
для использования палитры ColourBrewer Dark2
:
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)
ОК, поэтому визуальный осмотр говорит мне, что код работал.
Теперь я хочу подтвердить это, проверив объект:
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
для конкретных цветов заливки для использования?
Попробуйте построить сюжет,
g <- ggplot_build(p)
unique(g$data[[1]]["fill"])
fill
1 #1B9E77
16 #D95F02
28 #7570B3