geom_point中scale_fill与scale_color的使用问题:气泡图黑色轮廓实现
问题分析与解决方法
问题原因
- fill映射无效导致全黑:ggplot默认的点形状(如shape=19)是实心无填充的,仅受
color属性控制整体颜色,fill属性对这类形状不起作用,因此映射fill后会显示默认黑色。 - shape参数放错位置报错:你将
shape=21放在了aes()内部,而aes()的作用是将数据变量映射到图形属性。固定形状属于图形的静态参数,应放在geom_point()的外部,否则ggplot会把它当成要映射的变量,而连续变量无法映射到shape,从而触发报错。
正确代码实现
要生成带黑色轮廓、填充色随连续变量渐变的气泡图,需要:
- 使用支持
fill和color分离的形状(如shape=21,空心带填充的圆形),将shape作为geom_point的参数而非aes映射项。 - 将
fill映射到你的color变量,同时设置color="black"固定轮廓色。
修正后的代码:
age <-c(16, 5, 6, 22, 11, 12, 11, 13, 4, 8) y <- c(0.53, 0.50, 0.50, 0.46, 0.44, 0.44, 0.44, 0.43, 0.40, 0.40) s <- c(11.5, 78.0, 753.5, 44.5, 372.0, 62.0, 163.0, 25.0, 56.0, 80.5) color <- c(29, 15, 7, 30, 15, 26, 8, 14, 17, 12) df <- data.frame(age, y, s, color) p <- ggplot(df)+ geom_point(aes(x = age, y = y, size = s, fill = color), shape = 21, color = "black")+ # shape和轮廓色放在aes外 labs(x = "age", y = "rate")+ scale_size(range = c(.1, 10), name="s")+ scale_fill_viridis(limits = c(5, 20), oob = squish, option = "magma")+ scale_x_continuous(breaks=c(0, 10, 20, 30, 40, 50), limits = c(0,55))+ scale_y_continuous(breaks=c(-0.4, -0.2, 0, 0.2, 0.4), limits=c(-0.5, 0.5))+ theme_minimal() print(p)
补充说明
- 支持
fill属性的形状为21-25:这类形状属于“空心填充”型,color控制轮廓颜色,fill控制内部填充色;而1-20的形状多为实心或无填充设计,仅受color属性影响。 oob = squish参数会将超出limits范围的颜色值压缩到边界,因此你的color变量中大于20的数值(如29、30、26)会被映射为magma色阶的最大值,小于5的数值(如7、8)会被映射为最小值。
内容的提问来源于stack exchange,提问作者user237554
相关产品推荐
相关产品推荐

