R ggplot条件alpha值不符合预期问题求助
问题
想要根据数据中topGenre列的值设置多边形透明度:当topGenre为0时alpha设为0,其他值时设为0.9,但实际效果是,非0值的多边形完全不透明(alpha=1),只有topGenre=0的多边形透明度正确(alpha=0)。
已尝试的操作:
- 直接在
geom_sf的aes中使用alpha = ifelse(topGenre == 0, 0, 0.9) - 在数据框中新增
alpha_value列(cleanDF$alpha_value <- ifelse(cleanDF$topGenre == 0, 0, 0.9)),再设置alpha = alpha_value - 尝试
scale_alpha_discrete,但报错:Error in train_discrete(): ! Continuous value supplied to a discrete scale
附完整原始代码:
# Manually create a bounding box bbox<-make_bbox(c(-2,-1.8),c(52.53,52.43),f=0.05) # Create the basemap a <- get_map(bbox,maptype="stamen_toner_lite",source="google") # Only works using google as a source which it then corrects # Create the map ggplot(cleanDF) + annotation_raster(a, xmin=-2,xmax=-1.8,ymin=52.43,ymax=52.53) + geom_sf(aes(fill = factor(topGenre), geometry = geometry, alpha = ifelse(topGenre == 0, 0, 0.9))) + scale_fill_discrete(name="Most common music genre") + labs(title = "Choropleth Map of UK Postcode Areas by topGenre", alpha = "Transparency") + theme_minimal() + coord_sf(xlim = c(-2, -1.8), ylim = c(52.43, 52.53))
数据框片段:
name topGenre geometry alpha_value 1 B1 1 24 MULTIPOLYGON (((-1.899073 5... 0.9 2 B1 2 0 MULTIPOLYGON (((-1.913425 5... 0.0 3 B1 3 43 MULTIPOLYGON (((-1.914898 5... 0.9 4 B10 0 0 MULTIPOLYGON (((-1.876766 5... 0.0 5 B10 9 0 MULTIPOLYGON (((-1.832487 5... 0.0
解决方案
问题出在ggplot默认会对连续的alpha值进行线性缩放,导致你设置的0.9被映射到了最大不透明度1。解决方法是使用scale_alpha_identity(),让ggplot直接使用你指定的alpha数值,不做任何缩放。
修正后的代码
方式1:使用已有的alpha_value列
# 手动创建边界框 bbox <- make_bbox(c(-2,-1.8), c(52.53,52.43), f=0.05) # 获取底图 a <- get_map(bbox, maptype="stamen_toner_lite", source="google") # 绘制地图 ggplot(cleanDF) + annotation_raster(a, xmin=-2, xmax=-1.8, ymin=52.43, ymax=52.53) + geom_sf(aes(fill = factor(topGenre), geometry = geometry, alpha = alpha_value)) + scale_fill_discrete(name="最常见音乐流派") + # 使用identity scale直接应用alpha值,同时自定义图例 scale_alpha_identity( name = "透明度", guide = "legend", breaks = c(0, 0.9), labels = c("topGenre=0", "其他") ) + labs(title = "英国邮政编码区域topGenre分布图") + theme_minimal() + coord_sf(xlim = c(-2, -1.8), ylim = c(52.43, 52.53))
方式2:直接在aes中使用ifelse
ggplot(cleanDF) + annotation_raster(a, xmin=-2, xmax=-1.8, ymin=52.43, ymax=52.53) + geom_sf(aes(fill = factor(topGenre), geometry = geometry, alpha = ifelse(topGenre == 0, 0, 0.9))) + scale_fill_discrete(name="最常见音乐流派") + scale_alpha_identity( name = "透明度", guide = "legend", breaks = c(0, 0.9), labels = c("topGenre=0", "其他") ) + labs(title = "英国邮政编码区域topGenre分布图") + theme_minimal() + coord_sf(xlim = c(-2, -1.8), ylim = c(52.43, 52.53))
关键说明
scale_alpha_identity()会跳过ggplot默认的缩放逻辑,直接使用你提供的alpha数值,确保0.9能正确显示为对应透明度- 如果不需要图例,可以去掉
guide="legend"、breaks和labels参数,只保留scale_alpha_identity()
内容的提问来源于stack exchange,提问作者Jason Cooper
相关产品推荐
相关产品推荐

