Как передать шестнадцатеричные коды в geom_hline в ggplot? - PullRequest
1 голос
/ 09 марта 2020

В приведенном ниже коде я создаю ggplot, p1, используя данные из df1. Я хотел бы добавить горизонтальную линию со значением score для каждого элемента в df2 и закрасить каждую строку, используя соответствующий шестнадцатеричный код для каждого элемента, который содержится в столбце item_hexcode.

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

Может кто-нибудь указать, где я ошибаюсь?

library(tidyverse)
# create example dataframes
set.seed(123)
df1 <- tibble(x = 1:5, y = (sample(200:300, 5, replace = TRUE)/100))
df2 <- tibble(item = c("a", "a", "b", "c", "b"), 
              score = c(2.58, 2.63, 2.45, 2.13, 2.29), 
              item_hexcode = c("#DA020E", "#DA020E", "#034694", "#7CFC00", "#034694"))

# initial plot
p1 <- ggplot(df1, aes(x, y)) + geom_line() + ylim(2, 3)
p1

# overlay horizontal lines on first plot, and colour lines according to hexcodes
p2 <- p1 + geom_hline(data = df2, aes(yintercept = score, 
             colour = item_hexcode), linetype = "dashed" ) + 
  scale_color_manual(values = df2$item_hexcode)

p2

example_plot

Спасибо!

Ответы [ 2 ]

5 голосов
/ 09 марта 2020

Я думаю, что вы ищете функцию под названием scale_color_identity:

p2 <- p1 + geom_hline(data = df2, aes(yintercept = score, 
                                      colour = item_hexcode), 
                      linetype = "dashed" ) + 
  scale_color_identity()

p2

The result

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

Вы бы использовали scale_color_manual, если бы у вас было уровни в вашей переменной (например, «низкий», «средний», «высокий») и хотите назначить им определенные c цвета (а не цвета по умолчанию или цвета из палитры).

3 голосов
/ 09 марта 2020

Вы также можете использовать несколько неизвестную функцию I() непосредственно в вызове.

# overlay horizontal lines on first plot, and colour lines according to hexcodes
p1 + geom_hline(data = df2, 
                aes(yintercept = score, colour = I(item_hexcode)), 
                linetype = "dashed" 
    )

enter image description here

...