R语言中使用ggplot2绘制带颜色直方图时出现美学映射错误的解决方法咨询
解决ggplot直方图颜色映射的错误问题
嗨,我来帮你搞定这个报错~
你遇到的错误原因是:直接在geom_histogram里用my_data$col传递颜色时,长度和ggplot实际处理的数据不匹配。因为geom_histogram会把原始的1000行数据汇总成若干分箱(这里错误提示的59就是分箱后的行数),而你传入的my_data$col是1000行的向量,两者长度不一致,所以触发了这个美学映射的错误。
正确的解决方法
我们需要把颜色的映射放到aes()函数里,让ggplot自动处理分组和颜色的对应关系,再通过手动颜色标度指定具体颜色:
方法1:设置直方图边框颜色
如果你想给直方图的边框按col列分颜色,可以这样写:
library(ggplot2) my_data <- data.frame( a = abs(rnorm(1000,17,10)), b = a ) my_data$col = as.factor(ifelse(my_data$a > 17, "red", "blue")) # 正确的颜色映射写法 ggplot(my_data, aes(x=a, color=col)) + geom_histogram(binwidth=1) + scale_color_manual(values = c("blue"="blue", "red"="red"))
方法2:设置直方图填充颜色(更常用)
如果你的需求是给直方图的填充部分分颜色(而不是边框),应该用fill美学,同时可以加个黑色边框让分箱更清晰:
ggplot(my_data, aes(x=a, fill=col)) + geom_histogram(binwidth=1, color="black") + # 黑色边框区分分箱 scale_fill_manual(values = c("blue"="blue", "red"="red"))
为什么原来的代码不行?
当你写color = my_data$col时,你直接把原始数据的向量传给了geom,但ggplot绘制直方图时,内部会先对数据做统计汇总(计算每个分箱的频数),生成的是分箱后的数据集(这里是59行),而你的my_data$col是1000行,长度不匹配,所以报错。把映射放到aes()里后,ggplot会根据原始数据的分组信息,自动对应到分箱后的结果,就不会有长度问题啦。
内容的提问来源于stack exchange,提问作者stats_noob
相关产品推荐
相关产品推荐

