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

时间:2019-03-15 16:42:35

标签: r ggplot2 colors

我有一个简单的数据框,形式为:

x    y    tissue    color_code
1    2    nerve     #EEEE00
2    3    brain     #33CCCC

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

我想使用相应的颜色代码对y和x以及组织的颜色进行简单的线图绘制。

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

ggplot(df,aes(x=x,y=y,color=tissue))+
   geom_point()+
   scale_color_manual(values=df$color_code)

但是,颜色最终都是相同的颜色。

最好的方法是什么?

谢谢!

1 个答案:

答案 0 :(得分:3)

如果您的颜色来自数据框中的另一列,则可能会导致事情无法按正确的顺序进行,就像我按原样运行您的代码时那样。组织将以某种顺序映射到颜色,如果已经是因子,则基于因子水平;如果不是,则按照字母顺序。但是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)

reprex package(v0.2.1)于2019-03-15创建