Изменить цветовую палитру по умолчанию в ggplot
Я написал функцию, которая возвращает вектор имен цветов:
custom.colors <- function(n) {
palette <- c("dodgerblue1", "skyblue4", "chocolate1", "seagreen4",
"bisque3", "red4", "purple4", "mediumpurple3",
"maroon", "dodgerblue4", "skyblue2", "darkcyan",
"darkslategray3", "lightgreen", "bisque",
"palevioletred1", "black", "gray79", "lightsalmon4",
"darkgoldenrod1")
if (n > length(palette))
warning('palette has duplicated colours')
rep(palette, length.out=n)
}
Я хотел бы, чтобы ggplot использовал вышеуказанную функцию для генерации палитры по умолчанию. Может быть, только для дискретных весов. С помощью scale_manual()
каждый раз это слишком сложно. Является ли это возможным?
3 ответа
@baptiste указал мне на сообщение на доске объявлений, в котором упоминается функция set_default_scale
который может быть использован для установки палитры по умолчанию. Следующее решение работает только со старыми версиями ggplot2.
Сначала нам нужна функция, которая производит имена цветов или коды. Я назвал мой magazine.colours
:
magazine.colours <- function(n, set=NULL) {
set <- match.arg(set, c('1', '2'))
palette <- c("red4", "darkslategray3", "dodgerblue1", "darkcyan",
"gray79", "black", "skyblue2", "dodgerblue4",
"purple4", "maroon", "chocolate1", "bisque3", "bisque",
"seagreen4", "lightgreen", "skyblue4", "mediumpurple3",
"palevioletred1", "lightsalmon4", "darkgoldenrod1")
if (set == 2)
palette <- rev(palette)
if (n > length(palette))
warning('generated palette has duplicated colours')
rep(palette, length.out=n)
}
(Он принимает необязательный set
аргумент только для того, чтобы показать, что вы не ограничены одной палитрой.) Хорошо, теперь мы создаем "масштаб", который я назвал magazine
, Это основано на масштабе пивовара ggplot, и код довольно уродлив:
ScaleMagazine <- proto(ScaleColour, expr={
objname <- 'magazine'
new <- function(., name=NULL, set=NULL, na.colour='yellowgreen',
limits=NULL, breaks = NULL, labels=NULL,
formatter = identity, variable, legend = TRUE) {
b_and_l <- check_breaks_and_labels(breaks, labels)
.$proto(name=name, set=set, .input=variable, .output=variable,
.labels = b_and_l$labels, breaks = b_and_l$breaks,
limits= limits, formatter = formatter, legend = legend,
na.colour = na.colour)
}
output_set <- function(.) {
missing <- is.na(.$input_set())
n <- sum(!missing)
palette <- magazine.colours(n, .$set)
missing_colour(palette, missing, .$na.colour)
}
max_levels <- function(.) Inf
})
scale_colour_magazine <- ScaleMagazine$build_accessor(list(variable = '"colour"'))
scale_fill_magazine <- ScaleMagazine$build_accessor(list(variable = '"fill"'))
Здесь важно определить output_set
это функция, которую вызывает ggplot, чтобы получить названия / коды цветов. Кроме того, если вам нужны дополнительные аргументы, они должны быть включены в new
и позже можно получить доступ как .$argument_name
, В приведенном выше примере output_set
просто звонит magazine.colours
,
Теперь проверьте, действительно ли новый масштаб работает:
qplot(mpg, wt, data=mtcars, shape=21,
colour=factor(carb), fill=factor(carb)) +
scale_colour_magazine(set='1') +
scale_fill_magazine(set='1')
Чтобы сделать его по умолчанию, просто используйте set_default_scale
,
set_default_scale("colour", "discrete", "magazine")
set_default_scale("fill", "discrete", "magazine")
И это будет так.
> qplot(mpg, wt, data=mtcars, colour=factor(carb), fill=factor(carb))
17 дней назад (2020-05-19) работа Карсона Сиверта была объединена с разрабатываемой версией ggplot2, которая позволяет указывать дискретную цветовую палитру по умолчанию с опцией (ggplot2.discrete.fill
& ggplot2.discrete.color
):
options(ggplot2.discrete.color = c("red", "#af01ef"))
Это также позволяет указать несколько поддонов разного размера (с использованием минимально достаточной палитры):
options(ggplot2.discrete.color = list(c("red", "#af01ef"), custom.colors(99)))
К сожалению, он не использует функцию палитры (например, ваш custom.colors
), но для этого требуется функция масштабирования (чтобы вы могли создать ее, как указано в ответе @ernestA, чтобы выдать желаемое предупреждение).
Из НОВОСТЕЙ:
Дискретные цветовые шкалы по умолчанию теперь настраиваются через
options()
изggplot2.discrete.colour
а такжеggplot2.discrete.fill
. Если задан вектор символов цветовых кодов (или список векторов символов) с достаточной длиной, эти цвета используются для масштаба по умолчанию. Видетьhelp(scale_colour_discrete)
для получения дополнительных сведений и примеров (@cpsievert, #3833).
Чтобы переопределить цветовую шкалу по умолчанию, вы также можете просто переопределить ggplot
функция:
ggplot <- function(...) ggplot2::ggplot(...) + scale_color_brewer(palette="Spectral")
То же самое работает для шкалы заполнения.
Просто назначьте переменную с именем желаемой шкалы:
scale_colour_discrete <- function(...)
scale_colour_manual(..., values = c('dodgerblue1', *))
Это работает, так как ggplot по возможности возьмет шкалы по умолчанию из глобальной среды, аналогично:
get('scale_colour_discrete', envir = globalenv())