Емуляція кольорової палітри ggplot2 за замовчуванням


192

Яку функцію я можу використовувати для імітації палітри кольорів за замовчуванням ggplot2 для потрібної кількості кольорів. Наприклад, на вході 3 вийде символьний вектор кольорів HEX з цими кольорами: введіть тут опис зображення


10
Подивіться на пакет ваг
Хадлі

2
Так! Я тримаю роздруківку display.brewer.all()на своєму столі. Я думаю, що мені подобається Set1 найкращий за факторами.
Джон Колбі

гарна ідея! Я збираюся зробити ту саму роздруківку. Погоджено на Set1, я вже знайшов себе в більшості своїх нових діаграм.
SFun28

Відповіді:


267

Це просто однаково розташовані відтінки навколо кольорового колеса, починаючи з 15:

gg_color_hue <- function(n) {
  hues = seq(15, 375, length = n + 1)
  hcl(h = hues, l = 65, c = 100)[1:n]
}

Наприклад:

n = 4
cols = gg_color_hue(n)

dev.new(width = 4, height = 4)
plot(1:n, pch = 16, cex = 2, col = cols)

введіть тут опис зображення


2
+1 Мені подобається ваше гарне, просте рішення, хоча я все ще намагаюся зрозуміти, навіщо вам length=n+1це seq, а в менеlength=n
Андрі

18
Тому що 0 == 360
хадлі

131

Це результат від

library(scales)
show_col(hue_pal()(4))

Чотириколірний ggplot

show_col(hue_pal()(3))

Три кольорові ggplot


1
Як не дивно, кольори (як мінімум, на другому малюнку) не відповідають їх RGB-кодам. Однак, дивлячись на графік, який я створив локально, ці RGB-коди є правильними.
Sparhawk

1
можливо, це річ із браузером?
Climbs_lika_Spyder

1
Так, дуже дивно. У Firefox зелений - це # 15ba3e, у Chromium - це # 00b83a, а після завантаження зображення та перегляду у спеціальній програмі для зображень (Gwenview) - це # 00b839. Тільки Konqueror показує це правильно як # 00ba38. Так що тільки один правий, і жоден не узгоджується!
Sparhawk

1
Чи є спосіб отримати назву кольору, наприклад, "red2", "blue3"? Код кольору, наприклад, # 00b83a, важко використовувати інтуїтивно.
Sibo Jiang

2
Для зручності копіювання та вставлення шістнадцяткові значення: # f8766d - Червоний # 00ba38 - Зелений # 83b0fc - Синій
штампом

62

Ці відповіді дуже хороші, але я хотів поділитися ще однією справою, яку я виявив у stackoverflow, що є дуже корисним, ось пряме посилання

В основному, @DidzisElferts показує, як ви можете отримати всі кольори, координати тощо, які ggplot використовує для створення створеного вами ділянки. Дуже хороша!

p <- ggplot(mpg,aes(x=class,fill=class)) + geom_bar()
ggplot_build(p)$data
[[1]]
     fill  y count x ndensity ncount  density PANEL group ymin ymax xmin xmax
1 #F8766D  5     5 1        1      1 1.111111     1     1    0    5 0.55 1.45
2 #C49A00 47    47 2        1      1 1.111111     1     2    0   47 1.55 2.45
3 #53B400 41    41 3        1      1 1.111111     1     3    0   41 2.55 3.45
4 #00C094 11    11 4        1      1 1.111111     1     4    0   11 3.55 4.45
5 #00B6EB 33    33 5        1      1 1.111111     1     5    0   33 4.55 5.45
6 #A58AFF 35    35 6        1      1 1.111111     1     6    0   35 5.55 6.45
7 #FB61D7 62    62 7        1      1 1.111111     1     7    0   62 6.55 7.45

45

Зі сторінки 106 книги ggplot2 Хедлі Вікхема:

Кольорова схема за замовчуванням scale_colour_hue вибирає рівномірно розташовані відтінки навколо колісного колеса hcl.

За допомогою трохи зворотної інженерії ви можете побудувати цю функцію:

ggplotColours <- function(n = 6, h = c(0, 360) + 15){
  if ((diff(h) %% 360) < 1) h[2] <- h[2] - 360/n
  hcl(h = (seq(h[1], h[2], length = n)), c = 100, l = 65)
}

Демонструючи це на барплоті:

y <- 1:3
barplot(y, col = ggplotColours(n = 3))

введіть тут опис зображення


2
Це навіть простіше, ніж це. Ви можете уникнути першого рядка алгебри, оскільки, хоча це не допомагає, hclпереробляє значення> 360.
Джон Колбі

13
Ви навіть можете використовувати scales:::show_col(ggplotColours(n=3))для відображення кольору та значень
Stat-R

хоча я ще не зрозумів, як отримати ваги та її show_col, щоб виплюнути (шістнадцятковий або будь-який інший формат) значення, які він накреслює ...
Стефано,
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.