在R中使用ggplot2和tidyverse为满足2个及以上条件的散点着色
使用ggplot2和tidyverse实现条件着色的散点图
问题描述
现有如下结构的DataFrame:
| value1 | value2 | condition1 | condition2 | condition3 |
|---|---|---|---|---|
| 2.3 | 0.1 | FALSE | FALSE | TRUE |
| 3.5 | 2.6 | FALSE | FALSE | TRUE |
| 3.1 | 2.5 | TRUE | TRUE | TRUE |
| 3.2 | 2.3 | FALSE | TRUE | TRUE |
| 2.4 | 1.1 | TRUE | TRUE | FALSE |
| 2.7 | 2.2 | FALSE | TRUE | FALSE |
| 2.5 | 3 | TRUE | FALSE | TRUE |
| 2.9 | 2 | TRUE | TRUE | TRUE |
| 4.2 | 1 | FALSE | FALSE | TRUE |
| 2.2 | 1.5 | FALSE | TRUE | TRUE |
需要绘制value1与value2的散点图,并为满足2个及以上TRUE条件的点着色。
解决方案
不需要用group_by,核心是先计算每行满足TRUE的条件数量,再据此设置颜色分组:
- 加载所需包:
library(tidyverse)
- 处理数据,生成条件判断列:
用rowwise()结合sum()计算每行的TRUE数量,再用mutate()生成一个布尔列,标记是否满足2个及以上TRUE:
df_processed <- df %>% rowwise() %>% mutate( true_count = sum(c(condition1, condition2, condition3)), meets_threshold = true_count >= 2 ) %>% ungroup()
rowwise()确保逐行计算sum(c(...))把三个条件列转为向量后求和(TRUE会被当作1,FALSE当作0)meets_threshold最终用来区分需要着色的点绘制散点图:
用ggplot(),将color参数绑定到meets_threshold,即可实现条件着色:
ggplot(df_processed, aes(x = value1, y = value2, color = meets_threshold)) + geom_point(size = 3) + labs( x = "Value 1", y = "Value 2", color = "满足2个及以上条件" ) + theme_minimal()
- 如果想自定义颜色,可以用
scale_color_manual(),比如:
ggplot(df_processed, aes(x = value1, y = value2, color = meets_threshold)) + geom_point(size = 3) + scale_color_manual(values = c("FALSE" = "gray", "TRUE" = "darkorange")) + labs( x = "Value 1", y = "Value 2", color = "满足2个及以上条件" ) + theme_minimal()
完整代码示例
# 加载包 library(tidyverse) # 构造示例数据框 df <- tibble( value1 = c(2.3, 3.5, 3.1, 3.2, 2.4, 2.7, 2.5, 2.9, 4.2, 2.2), value2 = c(0.1, 2.6, 2.5, 2.3, 1.1, 2.2, 3, 2, 1, 1.5), condition1 = c(FALSE, FALSE, TRUE, FALSE, TRUE, FALSE, TRUE, TRUE, FALSE, FALSE), condition2 = c(FALSE, FALSE, TRUE, TRUE, TRUE, TRUE, FALSE, TRUE, FALSE, TRUE), condition3 = c(TRUE, TRUE, TRUE, TRUE, FALSE, FALSE, TRUE, TRUE, TRUE, TRUE) ) # 数据处理 df_processed <- df %>% rowwise() %>% mutate( true_count = sum(c(condition1, condition2, condition3)), meets_threshold = true_count >= 2 ) %>% ungroup() # 绘制散点图 ggplot(df_processed, aes(x = value1, y = value2, color = meets_threshold)) + geom_point(size = 3) + scale_color_manual(values = c("FALSE" = "gray", "TRUE" = "darkorange")) + labs( x = "Value 1", y = "Value 2", color = "满足2个及以上条件" ) + theme_minimal()
内容的提问来源于stack exchange,提问作者Josh
相关产品推荐
相关产品推荐

