在ggplot2中绘制带指定标记点的密度曲线求助
问题描述
我有一组说话者的音高数据,数据结构如下:
structure(list(`Subject no.` = c(12, 78, 4, 26, 97, 60, 34, 54, 107, 48, 50, 115, 113, 32, 25, 30, 42, 1, 20, 102, 37, 47, 56, 80, 33, 35, 41, 81, 94, 111, 29, 69, 101, 39, 43, 59, 90, 93, 105, 64, 71, 73, 9, 16, 46, 21, 23, 27, 51, 84, 13, 99, 112, 52, 103, 6, 85, 87, 40, 67, 79, 96, 114, 2, 49, 72, 38, 58, 75, 68, 31, 62, 95, 100, 17, 36, 44, 45, 3, 15, 76, 8, 116, 63, 19, 77, 106, 88, 28, 65, 10, 11, 24, 22, 86, 66, 74, 18, 108, 53), distvoice = c("L1", "L2", "L3", NA, "L4", NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, "M1", NA, NA, NA, NA, NA, NA, NA, "M2", NA, NA, "M3", NA, NA, NA, NA, NA, "M4", NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, "H1", NA, NA, "H2", "H3", "H4", NA), f0st = c(8.56434978, 8.7741989, 9.18641696, 9.38890278, 9.38890278, 9.58904767, 9.78690515, 9.78690515, 9.78690515, 10.1759629, 10.1759629, 10.1759629, 10.3672614, 10.5564692, 10.7436315, 10.9287919, 10.9287919, 11.111993, 11.111993, 11.111993, 11.2932757, 11.4726798, 11.4726798, 11.4726798, 11.6502439, 11.6502439, 11.6502439, 11.6502439, 11.6502439, 11.6502439, 11.8260052, 11.8260052, 11.8260052, 12, 12, 12, 12, 12, 12, 12.1722635, 12.1722635, 12.1722635, 12.3428298, 12.3428298, 12.511732, 12.6790023, 12.6790023, 12.6790023, 12.6790023, 12.6790023, 12.8446719, 12.8446719, 12.8446719, 13.0087712, 13.0087712, 13.1713296, 13.1713296, 13.1713296, 13.3323757, 13.3323757, 13.3323757, 13.3323757, 13.3323757, 13.4919376, 13.4919376, 13.4919376, 13.6500423, 13.6500423, 13.6500423, 13.8067161, 14.1158733, 14.1158733, 14.1158733, 14.1158733, 14.2684059, 14.2684059, 14.2684059, 14.4196063, 14.7181024, 14.7181024, 14.7181024, 15.0115389, 15.0115389, 15.1564129, 15.3000846, 15.3000846, 15.3000846, 15.5838998, 15.8631371, 15.8631371, 16.0010848, 16.5421395, 16.5421395, 16.6748017, 16.8064552, 16.9371149, 17.1955129, 17.3232798, 17.4501107, 17.7010186)), row.names = c(NA, -100L), class = c("tbl_df", "tbl", "data.frame"))
我需要绘制音高值分布的密度曲线,同时在x轴上标记出12个拥有distvoice值的说话者的位置,以体现他们在分布中的所处位置。目前已经画出基础密度曲线:
ggplot(data=f0dist, aes(x=f0st)) + geom_density() + labs(title='Distribution of pitch values for all speakers', x='f0 (semitones)', y='density')
(配图:显示说话者音高值分布的密度曲线)
尝试过叠加标签和使用geom_point,但无法仅显示这12位说话者的标记点,求解决办法。
解决方案
核心思路是筛选出distvoice不为NA的子集,单独用图层标记这些点,避免和全量数据混淆。
方法1:标记点+对应标签
在原有代码基础上新增针对目标子集的图层,同时显示标记点和distvoice标签:
library(ggplot2) ggplot(data=f0dist, aes(x=f0st)) + # 绘制全量数据的密度曲线 geom_density() + # 标记目标说话者的位置(y=0贴在x轴上) geom_point(data = subset(f0dist, !is.na(distvoice)), aes(y = 0), color = "red", size = 3) + # 添加distvoice标签,微调y轴位置避免遮挡 geom_text(data = subset(f0dist, !is.na(distvoice)), aes(y = 0.01, label = distvoice), color = "red", size = 4) + labs(title='Distribution of pitch values for all speakers', x='f0 (semitones)', y='density') + # 可选:锁定y轴下限为0,防止标签超出画布 ylim(0, NA)
方法2:仅标记点
如果不需要标签,只保留点标记:
library(ggplot2) ggplot(data=f0dist, aes(x=f0st)) + geom_density() + geom_point(data = subset(f0dist, !is.na(distvoice)), aes(y = 0), color = "darkorange", size = 3) + labs(title='Distribution of pitch values for all speakers', x='f0 (semitones)', y='density')
关键说明
subset(f0dist, !is.na(distvoice))精准筛选出有distvoice值的12条数据,确保只标记目标说话者。y=0让点贴在x轴上,清晰展示它们在分布中的位置;若想让点在密度曲线下方稍远处,可设为y=0.005这类小数值。- 颜色、大小可自定义,提升可视化辨识度。
内容的提问来源于stack exchange,提问作者Alice P
相关产品推荐
相关产品推荐

