如何将十六进制代码传递给ggplot中的geom_hline?
Posted
技术标签:
【中文标题】如何将十六进制代码传递给ggplot中的geom_hline?【英文标题】:How to pass hex codes to geom_hline in ggplot? 【发布时间】:2020-06-21 11:48:15 【问题描述】:在下面的代码中,我使用来自df1
的数据创建了一个ggplot p1
。我想在df2
中的每个项目的score
值处添加一条水平线,并使用包含在列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
谢谢!
【问题讨论】:
【参考方案1】:我认为您正在寻找名为 scale_color_identity
的函数:
p2 <- p1 + geom_hline(data = df2, aes(yintercept = score,
colour = item_hexcode),
linetype = "dashed" ) +
scale_color_identity()
p2
当您为美学参数设置的变量所取的值可以直接使用时使用此功能(这里的值是十六进制代码,可以直接被ggplot
解释为颜色)。
如果您的变量中有级别(例如“低”、“中”、“高”),并且想要为它们分配特定颜色(而不是默认颜色或来自调色板)。
【讨论】:
解决了!也感谢您的有用解释。【参考方案2】:您也可以直接在调用中使用有点未知的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"
)
【讨论】:
我当然不知道,至少。不过,这看起来像是一个非常简单、有用的功能。谢谢!以上是关于如何将十六进制代码传递给ggplot中的geom_hline?的主要内容,如果未能解决你的问题,请参考以下文章
如何从 ggplot2::geom_density_2d_filled 获取有关轮廓的信息?
aes() 中的传递选项和 ggplot2 中的传递选项之间的区别