r - 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)
然而,颜色最终都是相同的颜色。
做这个的最好方式是什么?
提前致谢!
解决方案
让你的颜色来自数据框中的另一列会冒着事情没有按正确顺序完成的风险,就像我按原样运行你的代码时发生的那样。组织按特定顺序映射到颜色,如果它已经是一个因子,则基于因子水平,如果不是,则按字母顺序。但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 日创建
推荐阅读
- flutter - 如何从 Firestore 获取数据并在 Flutter 中显示?
- snowflake-cloud-data-platform - 插入时的雪花微分区
- mysql - 在 Mysql Json Collection 数据中搜索
- angular - app-routing 生成触发 auth 服务的新实例
- firebase - 错误:flutter/lib/ui/ui_dart_state.cc(177) 未处理的异常:NoSuchMethodError:方法“插入”在 null 上调用
- java - Java:您调用 Math.random() 的次数是否会影响结果
- java - run方法内部的线程状态冲突;为什么线程状态不是“正在运行”
- ios - 斯威夫特:有没有一种简单的方法可以在 MapKit 中制作一个有效的“位置按钮”?
- opengl - How to instance draw with different transformations for multiple objects
- macos - 为什么 Docker For desktop (Mac) Persistent Volume 主机路径上的 Kubernetes 变得滞后?