ggplot 将颜色代码列与 R 数据框中的另一列匹配

And*_*mel 3 r colors ggplot2

我有以下形式的简单数据框:

x    y    tissue    color_code
1    2    nerve     #EEEE00
2    3    brain     #33CCCC
Run Code Online (Sandbox Code Playgroud)

每个组织有数千行。每个组织将具有相同的颜色代码(例如,所有带有神经的行的颜色代码为 #EEEE00 等)

我想使用相应的颜色代码按组织制作 y 与 x 和颜色的简单线图。

我到目前为止的代码看起来像这样

ggplot(df,aes(x=x,y=y,color=tissue))+
   geom_point()+
   scale_color_manual(values=df$color_code)
Run Code Online (Sandbox Code Playgroud)

然而,颜色最终都是相同的颜色。

做这个的最好方式是什么?

提前致谢!

cam*_*lle 5

让您的颜色来自数据框中的另一列会冒着事情没有按正确顺序显示的风险,就像我按原样运行您的代码时发生的那样。组织按特定顺序映射到颜色,如果它已经是一个因子,则基于因子水平,或者如果它不是,则按字母顺序。但df$color_code将只是一个颜色向量,并将按它们出现的顺序分配颜色。因此,对于您的代码,由于此顺序之间的不匹配,我将浅黄色置于“大脑”而不是“神经”。

这也可能无法很好地缩放 - 假设您对“大脑”进行了两次观察,这意味着您将“大脑”颜色(蓝绿色)放入调色板两次。

我要做的是使用数据创建一个命名的颜色向量,其中每个都出现一次。名称意味着无论顺序如何,您的颜色都将匹配到正确的类别。

我添加了一些更多的观察结果来展示。

library(dplyr)
library(ggplot2)

df <- tribble(
  ~x,  ~y,  ~tissue,  ~color_code,
   1,   2,   "nerve",  "#EEEE00",
   2,   3,   "brain",  "#33CCCC",
   3,   2.5, "other",  "#DD55AA",
   4,   1,   "nerve",  "#EEEE00"
)

colors <- distinct(df, tissue, color_code)
pal <- colors$color_code
names(pal) <- colors$tissue
pal
#>     nerve     brain     other 
#> "#EEEE00" "#33CCCC" "#DD55AA"

ggplot(df, aes(x = x, y = y, color = tissue)) +
  geom_point() +
  scale_color_manual(values = pal)
Run Code Online (Sandbox Code Playgroud)

reprex 包(v0.2.1)于 2019 年 3 月 15 日创建