首页 > 解决方案 > ggplot将颜色代码列与R数据框中的另一列匹配

问题描述

我有这个简单的数据框形式:

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

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

我想使用相应的颜色代码制作一个简单的 y vs x 和颜色线图。

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

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

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

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

提前致谢!

标签: rggplot2colors

解决方案


让你的颜色来自数据框中的另一列会冒着事情没有按正确顺序完成的风险,就像我按原样运行你的代码时发生的那样。组织按特定顺序映射到颜色,如果它已经是一个因子,则基于因子水平,如果不是,则按字母顺序。但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 包(v0.2.1)于 2019 年 3 月 15 日创建


推荐阅读