R ggplot2中强制指定数据点特定绘图符号的实现方法
问题原因
代码形状设置不生效有两个核心问题:
- 示例数据构造存在变量错误:代码中未定义
zc、p.lcl、p.ucl三个变量,前面创建的置信限变量名为lcl、ucl,x轴对应的zc变量完全缺失,直接运行会报错。 - ggplot2的手动标度函数(如
scale_shape_manual())仅在aes()内部映射了对应美学属性时才会生效。原代码的全局美学映射中没有指定shape映射规则,系统无法识别需要调用自定义形状配置,因此全部使用默认实心圆点绘制。
修正方案
方案1:映射形状属性(推荐,可自动生成图例)
先修正数据构造逻辑,新增一列标记每个点的形状分组,再在美学映射中关联shape属性,最后通过scale_shape_manual()指定对应形状值:
library(ggplot2) library(tibble) # 修正后的数据构造代码 p.est <- c(1.65, 1.55, 0.70, 1.61, 1.25) lcl <- c(1.25, 1.10, 0.50, 1.20, 1.02) ucl <- c(2.20, 2.05, 0.90, 2.20, 1.50) zc <- 1:5 # 补全x轴序列 toy.data <- tibble( zc = zc, p.est = p.est, p.lcl = lcl, p.ucl = ucl, shape_grp = c("菱形", "圆形", "菱形", "菱形", "圆形") # 形状分组标记 ) # 修正后的绘图代码 ggplot(toy.data, aes(zc, p.est, ymin = p.lcl, ymax = p.ucl)) + geom_pointrange( aes(shape = shape_grp), # 映射形状属性 position = position_dodge(width = 0.1), size = 1 # 调大尺寸让形状更易识别 ) + scale_shape_manual(values = c("菱形" = 5, "圆形" = 16)) + # 手动匹配形状值 geom_hline(yintercept = 1) + ylim(0.5, 2.5)
方案2:直接指定形状向量(无需图例时使用)
如果不需要生成形状对应的图例,可以不用做美学映射,直接在geom_pointrange()中给shape参数传入长度和数据行数一致的形状向量即可,此时不需要调用scale_shape_manual():
ggplot(toy.data, aes(zc, p.est, ymin = p.lcl, ymax = p.ucl)) + geom_pointrange( shape = c(5, 16, 5, 5, 16), # 直接按顺序传入每个点的形状值 position = position_dodge(width = 0.1), size = 1 ) + geom_hline(yintercept = 1) + ylim(0.5, 2.5)
提示:形状值
5为空心菱形,16为实心圆形,如果需要实心菱形可以把对应值换成18。
内容的提问来源于stack exchange,提问作者Kay Jay
相关产品推荐
相关产品推荐

