R: цвет легенды в соответствии с уровнями факторов - PullRequest
1 голос
/ 15 марта 2019

Вдохновленный этим вопрос, где очевидно, что верхний ответ использует небезопасный / ошибочный способ добавить цвета в легенду для точечного графика.

Топ ответ предлагает сделать это:

data<-iris
plot(data$Sepal.Length, data$Sepal.Width, col=data$Species)
legend(7,4.3,unique(data$Species),col=1:length(data$Species),pch=1)

Комментарии предлагают использовать levels() вместо unique() для управления текстом и цветами при вызове legend(), но неясно, почему это поможет. Мне нужно лучшее объяснение, чтобы доверять этому коду.

Как написать код, гарантирующий правильную раскраску?

1 Ответ

0 голосов
/ 15 марта 2019

Я нашел решение:

data <- iris
# Create a translation table that couple species to color
colorcode = data.frame(
  cbind(colorsMy = c("red", "green", "blue"), species = levels(data$Species)),
  stringsAsFactors = F)
# Make vector with colors for the different points in the scatter
iriscolors = sapply(data$Species,  # Species to colors translation acc to colorcode
                    function(x) colorcode$colorsMy[colorcode$species == x])
# Plot the scatter using the color vector constructed according the colorcode
plot(data$Sepal.Length, data$Sepal.Width, col = iriscolors, pch = 19)
# Since iriscolors according to colorcode, I can use colorcode for the legend
legend("bottomright", legend = colorcode$species, fill = colorcode$colorsMy)

Этот код немного громоздкий, но простой в использовании и явно создает правильную цветовую маркировку в легенде. «Хитрость» заключается в создании переменной colorcode, которая служит таблицей перевода между уровнями фактора (в данном случае видами радужной оболочки) и цветами для легенды.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...