如何在ggtern三元图上标注成分均值的百分比及时长信息?
给ggtern三元图的成分均值添加带百分比和时长的标注线
核心步骤说明
- 先把成分均值的比例转换为时长(按一天24小时计算:时长=比例×24)
- 用
geom_segment绘制从均值点到三个轴的标注线 - 用
annotate或geom_text添加包含百分比和时长的文本标注
代码示例
假设你已经通过epicoda算出成分均值cm(比例形式),先做预处理:
# 示例成分均值(比例,总和为1) cm <- c(SB = 0.352, Sleep = 0.333, PA = 0.315) # 转换为时长(小时) cm_hours <- cm * 24 # 生成标注文本:百分比(时长h) labels <- sprintf("%.1f%% (%.1fh)", cm*100, cm_hours) names(labels) <- names(cm)
接着在ggtern绘图代码中集成标注线和文本:
library(ggtern) # 基础三元图(替换成你已有的散点/图层代码) ggtern(data = your_raw_data, aes(x = SB, y = Sleep, z = PA)) + geom_point(alpha = 0.6, color = "gray50") + # 添加成分均值点 geom_point(aes(x = cm["SB"], y = cm["Sleep"], z = cm["PA"]), color = "#e63946", size = 3, shape = 19) + # 绘制到三个轴的虚线标注线 geom_segment(aes(x = cm["SB"], xend = 1, y = cm["Sleep"], yend = 0, z = cm["PA"], zend = 0), color = "#e63946", linetype = "dashed") + geom_segment(aes(x = cm["SB"], xend = 0, y = cm["Sleep"], yend = 1, z = cm["PA"], zend = 0), color = "#e63946", linetype = "dashed") + geom_segment(aes(x = cm["SB"], xend = 0, y = cm["Sleep"], yend = 0, z = cm["PA"], zend = 1), color = "#e63946", linetype = "dashed") + # 添加轴外侧的标注文本 annotate("text", x = 1.05, y = 0, z = 0, label = labels["SB"], color = "#e63946", hjust = 0) + annotate("text", x = 0, y = 1.05, z = 0, label = labels["Sleep"], color = "#e63946", vjust = 1) + annotate("text", x = 0, y = 0, z = 1.05, label = labels["PA"], color = "#e63946", hjust = 1) + # 调整主题和轴标签 theme_bw() + labs(x = "久坐行为(SB)", y = "睡眠(Sleep)", z = "体力活动(PA)")
细节调整提示
- 标注线的终点对应三元轴的端点:SB轴端点是(1,0,0)、Sleep轴是(0,1,0)、PA轴是(0,0,1)
- 文本位置的偏移量(比如1.05)可以根据你的图大小微调,避免和散点或轴标签重叠
- 若需要更美观的排版,可给文本添加
size、face参数调整样式
内容的提问来源于stack exchange,提问作者Nic
相关产品推荐
相关产品推荐

