Стабильные переменные цвета на самом деле на разных участках - PullRequest
0 голосов
/ 03 сентября 2018

Я пытаюсь сохранить свои графики с постоянными переменными цветами, используя библиотеку factoextra для отображения результатов PCA. Воспроизводимый пример ниже:

data("decathlon2")
df <- decathlon2[1:23, 1:10]
library("FactoMineR")
res.pca <- PCA(df,  graph = FALSE)
get_eig(res.pca)

# Contributions of variables to PC1
fviz_contrib(res.pca, choice = "var", axes = 1, top = 10)
# Contributions of variables to PC2
fviz_contrib(res.pca, choice = "var", axes = 2, top = 10)

Мне бы хотелось, чтобы график для ПК1 и ПК2 имел цветовую палитру с 10 цветами, которая одинакова для всех графиков (то есть x100m будет красным на обоих). Тем не менее, в моем фактическом наборе данных у меня есть 15 объясняющих переменных, которые, кажется, превышают предел для цветного пивовара, поэтому есть 2 проблемы:

  1. Как сохранить согласованную цветовую схему
  2. Уметь использовать 15 цветов

Заранее спасибо.

1 Ответ

0 голосов
/ 03 сентября 2018

(я полагаю, вы уже знаете, что нужно добавить fill = "name" к вызову fviz_contrib(); в противном случае столбцы по умолчанию будут fill = "steelblue".)

Вы можете определить палитру вручную, чтобы каждая переменная соответствовала одному и тому же цвету.

Чтобы смоделировать проблему, используя пример в вопросе, предположим, что мы хотим показать только верхние 7, когда есть все 10 переменных вместе:

# naive way with 7-color palette applied to different variables
fviz_contrib(res.pca, choice = "var", fill = "name", color = "black", axes = 1, top = 7)
fviz_contrib(res.pca, choice = "var", fill = "name", color = "black", axes = 2, top = 7)

plot1

Мы можем создать палитру, используя hue_pal() из пакета scales, для 10 различных цветов (по одному на каждый столбец df).

(Вы также можете использовать палитры, такие как rainbow() / heat.colors() / и т. Д. Из базового пакета grDevices. Я считаю, что их цветовой диапазон по умолчанию довольно интенсивный, с тенденцией к чрезмерно вопиющий для гистограммы.)

mypalette <- scales::hue_pal()(ncol(df))
names(mypalette) <- colnames(df)

# optional: see what each color corresponds to
ggplot(data.frame(x = names(mypalette),
                  y = 1,
                  fill = mypalette)) +
  geom_tile(aes(x = x, y = y, fill = fill), color = "black") +
  scale_fill_identity() +
  coord_equal()

palette

Используйте scale_fill_manual() с самоопределенной палитрой на каждом графике:

fviz_contrib(res.pca, choice = "var", fill = "name", color = "black", axes = 1, top = 7) +
  scale_fill_manual(values = mypalette)
fviz_contrib(res.pca, choice = "var", fill = "name", color = "black", axes = 2, top = 7) +
  scale_fill_manual(values = mypalette)

plot2

...