ggplot2中使用I()映射颜色时无法添加图例的原因咨询
ggplot2颜色映射与图例生成问题解析
问题1:aes(color = I(mycols))搭配guides(color = "legend")无图例的原因
I()在ggplot2的美学映射中是**“按原值传递”**的标记,当你在aes()里用I(mycols)时,相当于直接把mycols里的颜色值赋值给点的颜色,完全绕过了ggplot2的颜色映射系统。此时ggplot2不会把color当作一个需要映射的变量,自然不会为它创建图例对应的映射关系,后续的guides(color = "legend")找不到可生成图例的映射项,所以不会显示图例。
问题2:scale_color_identity() + guides(color = "legend")无图例的原因
scale_color_identity()的作用是将映射的颜色变量值直接作为颜色使用,但它必须依赖aes()中存在对应的颜色映射。如果没有在aes()里指定colour = mycols(也就是没有把颜色列设为映射变量),scale_color_identity()没有可处理的映射对象,无法触发图例生成。只有当你在aes()中建立了colour = mycols的映射,再用scale_color_identity(guide = "legend"),ggplot2才会把颜色值本身作为图例的颜色和标签,生成预期的图例。
正确用法示例
你提供的第一段代码就是标准的正确写法,核心是先在aes()中建立颜色变量的映射,再用scale_color_identity()指定图例:
library(ggplot2) library(patchwork) df <- data.frame(x = 1:2, y = 1, mycols = colors()[c(10,30)]) # 正常生成图例的写法 ggplot(df) + geom_point(aes(x = x, y = y, colour = mycols)) + scale_color_identity(guide = "legend") + labs(title = "legend as expected")
内容的提问来源于stack exchange,提问作者tjebo
相关产品推荐
相关产品推荐

