如何解决R ggplot2绘图Discrete value错误及intensity分箱设置问题
问题原因
- 报错
Discrete value supplied to continuous scale的根本原因:cut()函数返回的zakresy是离散因子类型,但你调用的scale_color_gradientn()是专为连续数值设计的颜色映射函数,类型不匹配触发报错。 - 0值返回NA的原因:你当前用
seq(0, 1200, length.out=9)生成的分箱断点,默认左开右闭规则下第一个区间不包含等于0的情况,所以0会被识别为超出范围返回NA。
解决代码
按照你要求的分箱规则自定义断点即可,同时调整颜色映射函数匹配离散分箱:
library(dplyr) library(ggplot2) df1 <- data.frame( time = as.POSIXct(c("2021-05-04 01:00:00", "2021-05-04 02:00:00", "2021-05-04 03:00:00", "2021-05-04 04:00:00", "2021-05-04 05:00:00", "2021-05-04 06:00:00", "2021-05-04 07:00:00", "2021-05-04 08:00:00")), lng = c(15.363, 15.363, 15.363, 15.363 , 15.363, 15.363, 15.363, 15.363), lat = c(51.232, 51.232, 51.232, 51.232, 51.232, 51.232, 51.232, 51.232), name = c('aaa', 'bbb', 'ccc', 'ddd', 'eee', 'fff', 'ggg', 'hhh'), intensity = c(0, 7, 20, 200, 500, 500, 600, 800) ) # 自定义分箱断点,刚好匹配“等于0、(0;100]、(100;200]……(1100;1200]”规则 przedzialy <- c(-1, 0, seq(100, 1200, by = 100)) # 自定义分箱显示标签 etykiety <- c("0", "(0,100]", "(100,200]", "(200,300]", "(300,400]", "(400,500]", "(500,600]", "(600,700]", "(700,800]", "(800,900]", "(900,1000]", "(1000,1100]", "(1100,1200]") df1_new <- df1 %>% mutate(zakresy = cut(intensity, breaks = przedzialy, labels = etykiety)) paleta_rgb <- c("#41786E", "#5AA03C", "#BED200", "#FFFA78", "#FCDC00", "#F5BE00", "#F0A04B", "#E68246", "#E15F32", "#D2412D", "#C02E2A", "#B01A27", "#9F0A24") ggplot() + geom_point(data = df1_new, aes(lng, lat, color = zakresy), alpha = 0.5, show.legend = TRUE, size = 2) + # 改用离散颜色映射函数匹配因子类型的分箱字段 scale_color_manual(values = paleta_rgb, name = "强度区间") + coord_map() + theme_void()
如果你不需要显式生成分箱字段,只是要连续颜色按100间隔显示刻度,也可以用更简化的连续映射写法:
ggplot() + geom_point(data = df1, aes(lng, lat, color = intensity), alpha = 0.5, size = 2) + scale_color_gradientn(colors = paleta_rgb, breaks = seq(0, 1200, 100), limits = c(0,1200)) + coord_map() + theme_void()
内容的提问来源于stack exchange,提问作者Robert
相关产品推荐
相关产品推荐

