首页 > 解决方案 > 给定色标,查找特定值的十六进制颜色

问题描述

我正在为颜色编码而苦苦挣扎,希望你能提供帮助。这是我的问题。我有一个虚拟数据集:

df <- data.frame(x = 1:10, y = sample(1:100, 10, replace = FALSE, set.seed(2021)))

我首先想使用特定的色标绘制这些数据:

ggplot(data = df, aes(x = x, y = y, fill = y)) +
  geom_point(shape = 21) +
  scale_fill_continuous_divergingx(palette = "RdBu", 
                                   mid = 50, 
                                   rev = TRUE)

现在我想使用对应于 x = 6(即 y = 70)的颜色来绘制另一个图。鉴于某些限制,我不能只制作另一个具有相同比例的简单 ggplot 来执行此操作,而是需要“硬编码”该特定颜色的十六进制值,即#e99c8f。有没有办法做到这一点,这样我就可以在我的其他情节中使用 fill = "#e99c8f" ?

对于某些色标(例如 viridis),硬编码十六进制值很容易,但我还没有找到一种方法来处理这个,我需要它......:/

谢谢你的帮助!

标签: r

解决方案


尝试使用该ggplot_build()函数,以获取包含您的数据和所有图层的 data.frame,并查看它们映射到的颜色点(fill列):

R> p <- ggplot(data = df, aes(x = x, y = y, fill = y)) +
+  geom_point(shape = 21) +
+  scale_fill_continuous_divergingx(palette = "RdBu", 
+                                   mid = 50, 
+                                   rev = TRUE)
R> x <- ggplot_build(p)
R> x$data
[[1]]
      fill  x  y PANEL group shape colour size alpha stroke
1  #00578C  1  7     1    -1    21  black  1.5    NA    0.5
2  #CBDEEB  2 38     1    -1    21  black  1.5    NA    0.5
3  #ECF1F5  3 46     1    -1    21  black  1.5    NA    0.5
4  #F3D9D6  4 58     1    -1    21  black  1.5    NA    0.5
5  #0772AC  5 12     1    -1    21  black  1.5    NA    0.5
6  #E69C90  6 70     1    -1    21  black  1.5    NA    0.5
7  #EEBCB4  7 64     1    -1    21  black  1.5    NA    0.5
8  #611300  8 99     1    -1    21  black  1.5    NA    0.5
9  #E8A197  9 69     1    -1    21  black  1.5    NA    0.5
10 #4EA4CB 10 23     1    -1    21  black  1.5    NA    0.5

此外,scale_fill_continuous_divergingx()在内部使用 RColorBrewer 的“RdBu”调色板,您可以通过以下方式查询十六进制颜色:

R> RColorBrewer::brewer.pal(11, "RdBu")
R> scales::show_col(RColorBrewer::brewer.pal(11, "RdBu"))

推荐阅读