如何为包含两个geom_point散点图的ggplot添加图例?
如何为包含两个geom_point散点图的ggplot添加图例?
嘿,Assa!问题出在你设置颜色的方式上——你现在是直接把color参数写在aes()外面,相当于给整组点硬指定颜色,ggplot根本不会把这种固定颜色当成“需要生成图例的映射变量”。想要图例,得把颜色放到aes()里面做映射,再用scale_color_manual()来绑定你想要的颜色值。
我分两种情况给你改代码,先从你最后贴的简化版开始,再处理你原来带ifelse高亮基因的复杂版本:
一、简化版:给两个基础点组加图例
你原来的简化代码没有图例,是因为color不在映射里。修改成这样:
ggplot(data=combined_dataset) + # 把color放进aes,手动给这组点起个名字(比如"BJAB") geom_point(mapping = aes(x = rf_bjab_prot, y = rf_bjab_trans, color = "BJAB"), alpha=0.7, size = 3) + # 另一组点同理,起个名字"MIA PaCa" geom_point(mapping = aes(x = rf_miapaca_prot, y = rf_miapaca_trans, color = "MIA PaCa"), alpha=0.2, size = 3) + # 用scale_color_manual把名字和你要的颜色绑定,还能自定义图例标题 scale_color_manual(name = "细胞系", values = c("BJAB" = "blue1", "MIA PaCa" = "#D55E00"))
这样ggplot就会识别到color是一个分类映射,自动生成对应的图例啦。
二、复杂版:带目标基因高亮的图例
你原来的代码里有ifelse判断特定基因(EGFR、REL这些)的颜色,这时候我们可以先给数据集加两个标记列,区分每个点组里的目标基因和普通基因,再基于这些列做颜色映射:
第一步,先给数据加标记列(用dplyr的话更方便):
library(dplyr) combined_dataset <- combined_dataset %>% mutate( # 标记BJAB组的点是否是目标基因 bjab_group = ifelse(name.miapaca %in% genes, "BJAB-目标基因", "BJAB-其他基因"), # 标记MIA PaCa组的点是否是目标基因 miapaca_group = ifelse(name.miapaca %in% genes, "MIA PaCa-目标基因", "MIA PaCa-其他基因") )
第二步,修改ggplot代码,把颜色映射到新的标记列,再指定对应颜色:
ggplot(data=combined_dataset) + # BJAB组的点,颜色映射到bjab_group geom_point(mapping = aes(x = rf_bjab_prot, y = rf_bjab_trans, color = bjab_group), alpha=0.7, size = 3) + # MIA PaCa组的点,颜色映射到miapaca_group geom_point(mapping = aes(x = rf_miapaca_prot, y = rf_miapaca_trans, color = miapaca_group), alpha=0.2, size = 3) + # 你的文本注释部分保持不变(这些是固定颜色的标注,不需要进图例) geom_text_repel(mapping = aes(x = rf_bjab_prot, y = rf_bjab_trans, label = ifelse(name.miapaca %in% genes, name.miapaca, "")), size = 3, box.padding = 1, color = "darkblue") + geom_text_repel(mapping = aes(x = rf_miapaca_prot, y = rf_miapaca_trans, label = ifelse(rf_miapaca_prot >= 0.05 & rf_miapaca_trans >= 60, name.miapaca, "")), size = 3, box.padding = 1, color = "green") + geom_text_repel(mapping = aes(x = rf_bjab_prot, y = rf_bjab_trans, label = ifelse(rf_bjab_prot <= -0.5 & rf_bjab_trans <= -10, name.miapaca, '')), size = 3, box.padding = 1, color = "#009E73") + # 手动绑定每个分组对应的颜色,自定义图例标题 scale_color_manual(name = "点类型", values = c( "BJAB-目标基因" = "blue1", "BJAB-其他基因" = "maroon", "MIA PaCa-目标基因" = "#D55E00", "MIA PaCa-其他基因" = "skyblue" ))
这样修改后,图例就会显示出四个类别,对应你设置的不同颜色啦。
核心逻辑就是:只有当颜色是aes()里的映射变量(不管是数据原有的列,还是你手动创建的分类标记),ggplot才会生成图例,之前直接在外面赋值颜色,相当于告诉ggplot“这些点都是一个颜色,不用做区分”,自然就不会有图例了。
备注:内容来源于stack exchange,提问作者Assa Yeroslaviz
相关产品推荐
相关产品推荐

