R ggplot不同形状尺寸与图例不匹配问题及解决方案问询
ggplot2中自定义形状尺寸与图例不匹配的问题
问题代码
x <- rep(c(1:5), 5) y <- rep(1:5, each=5) z <- rep(seq(0, 1000, 250), each=5) w1 <- c(15:18,25) w2 <- c("\u25A0", "\u25CF", "\u25B2", "\u25C6", "\u25BC") t <- c(rep(c("a", "s", "d", "f", "g"), 5)) col <- c("red", "blue", "green", "black", "yellow") data <- cbind.data.frame(x,y,z,t) # 第一个绘图:形状尺寸与图例匹配 ggplot(data) + geom_point(aes(x=x, y=y, shape=t, size=z, color=as.factor(z))) + scale_shape_manual(values=w1) + scale_size_continuous(limits=c(0, 1000), breaks=c(0,250,500,1000)) + scale_color_manual(values=col, guide="none") # 第二个绘图:图形尺寸远小于图例,不匹配 ggplot(data) + geom_point(aes(x=x, y=y, shape=t, size=z, color=as.factor(z))) + scale_shape_manual(values=w2) + scale_size_continuous(limits=c(0, 1000), breaks=c(0,250,500,1000)) + scale_color_manual(values=col, guide="none")
问题描述
第一个绘图中,图形的形状尺寸与图例中的尺寸匹配;但第二个绘图中,图形的形状尺寸远小于图例,二者不对应。请问该问题的原因是什么?需求是:要么得到带有实心向下三角形的第一个绘图效果,要么让第二个绘图的图形尺寸与图例匹配,该如何实现?
问题原因
- 第一个绘图用的是ggplot2内置的形状编号(15-18、25),这类形状是矢量图形,
size参数直接控制几何尺寸,缩放逻辑和图例标记完全一致。 - 第二个绘图用的是Unicode字符(如
\u25BC),ggplot2会把这类字符当作文本处理,size参数对应的是字体大小,且实际显示大小受字体设计影响,导致图形尺寸远小于图例标记。
解决方案
方案一:用内置形状实现实心向下三角形
ggplot2内置了实心向下三角形的形状编号(26),只需修改w1即可,完美匹配图例尺寸:
# 替换25为26,得到实心向下三角形 w1 <- c(15:18,26) # 原绘图代码不变 ggplot(data) + geom_point(aes(x=x, y=y, shape=t, size=z, color=as.factor(z))) + scale_shape_manual(values=w1) + scale_size_continuous(limits=c(0, 1000), breaks=c(0,250,500,1000)) + scale_color_manual(values=col, guide="none")
方案二:让Unicode符号尺寸与图例匹配
如果必须用Unicode字符,改用geom_text渲染文本型符号,调整尺寸映射范围并修正图例标记:
ggplot(data) + # 用geom_text渲染Unicode字符,匹配t对应的符号 geom_text(aes(x=x, y=y, label=w2[match(t, c("a", "s", "d", "f", "g"))], size=z, color=as.factor(z))) + # 调整size的range参数,将z值映射到合适的字体大小范围 scale_size_continuous(limits=c(0, 1000), breaks=c(0,250,500,1000), range=c(3, 15)) + scale_color_manual(values=col, guide="none") + # 替换图例标记为Unicode字符 guides(size=guide_legend(override.aes=list(label=w2[1])))
注:range参数可根据实际显示效果微调,确保图形大小和图例匹配。
内容的提问来源于stack exchange,提问作者MPB_2022
相关产品推荐
相关产品推荐

