Если я правильно понял ваш вопрос, вы хотите создать собственную функцию scale_...
. Короче говоря, это несколько более глубокое погружение в исходный код.
Я покажу один подход, который просто изменит существующие функции в пакетах RColorBrewer, scale и, конечно же, ggplot2.
- Ядро должно модифицировать
RcolorBrewer::brewer.pal
, что, я думаю, в основном то, что вы хотите. Увидев код, он выбирает из списка цветов нужный, в зависимости от вашего «n». И это то, что нужно создать вручную. Я просто скопировал цвета из палитры «YlOrBr». На что следует обратить внимание: палитры Брюера не случайны, они были протестированы и созданы на предмет распознаваемости для печати, копирования и дальтонизма, поэтому я не уверен, что создавать свою собственную палитру - это очень разумно. Посмотрите https://colorbrewer2.org/, чтобы найти подходящие палитры. - изменить базовый селектор цвета
scales:::brewer_pal
- изменить
scale_fill/scale_color
функцию
Я свел функции к ядрам, так что они выиграли ' t делать обычные проверки и менее гибки. Вы можете изменить исходные функции, чтобы вернуть эту функциональность.
library(ggplot2)
mybrewerpal <- function(n, name) {# modified RcolorBrewer::brewer.pal
## the first call to switch would not be necessary in this example,
## but I leave it in order to make the underlying structure in brewer.pal clearer
switch(name, mypal = switch(n - 2, rgb(c(255, 254, 217), c(247, 196, 95), c(188, 79, 14), maxColorValue = 255),
rgb(c(255, 254, 254, 204), c(255, 217, 153, 76), c(212, 142, 41, 2), maxColorValue = 255),
rgb(c(255, 254, 254, 217, 153), c(255, 217, 153, 95, 52), c(212, 142, 41, 14, 4), maxColorValue = 255),
rgb(c(255, 254, 254, 254, 217, 153), c(255, 227, 196, 153, 95, 52), c(212, 145, 79, 41, 14, 4), maxColorValue = 255),
rgb(c(255, 254, 254, 254, 236, 204, 140), c(255, 227, 196, 153, 112, 76, 45), c(212, 145, 79, 41, 20, 2, 4), maxColorValue = 255),
rgb(c(255, 255, 254, 254, 254, 236, 204, 140), c(255, 247, 227, 196, 153, 112, 76, 45), c(229, 188, 145, 79, 41, 20, 2, 4), maxColorValue = 255),
rgb(c(255, 255, 254, 254, 254, 236, 204, 153, 102), c(255, 247, 227, 196, 153, 112, 76, 52, 37), c(229, 188, 145, 79, 41, 20, 2, 4, 6), maxColorValue = 255)
))
}
brewer_pal2 <- # modified from scales:::brewer_pal
function() { # stripped down all arguments, just to show the core
function(n) {
mybrewerpal(n, "mypal") ##modified, usually this is selected by a function
## with type and name as arguments, selecting a palette from a list called scales:::brewer
}
}
scale_fill_custom <- ### modified from scale_fill_brewer, removed some arguments
function (..., aesthetics = "fill") {
discrete_scale(aesthetics, "custom", brewer_pal2(), ...) ## give a new name to the
## scale, it will create a new Scale object.
}
p <-
ggplot(mtcars, aes(x = mpg, y = disp)) +
scale_fill_custom()
p + geom_point(shape = 21, aes(fill = as.factor(cyl)))
![](https://i.imgur.com/KbQyQBm.png)
p + geom_point(shape = 21, aes(fill = as.factor(carb)))
![](https://i.imgur.com/sSNFSMx.png)