如何在ggtern中沿用原始数据的轴范围与轴标签?
解决ggtern三元图轴刻度与原始数据匹配的问题
我明白你遇到的困扰了——ggtern默认会把输入的三元数据归一化到0-1的比例空间,所以直接用原始数值设置breaks时,超过1的标签会被截断,而且轴线和数据点的位置也对不上。下面是具体的解决步骤:
核心思路
ggtern的三元坐标系统默认基于比例(总和为1),要显示原始数值的刻度,需要:
- 明确告诉ggtern三个轴的原始数值范围,覆盖默认的归一化行为
- 调整坐标系统的比例,让原始数值的刻度正确对应到图上的位置
具体代码示例
假设你的数据框是df,包含三个列(比如A、B、C),最大值分别为12、10、4,代码如下:
library(ggtern) # 模拟你的数据(替换成你实际的数据框) set.seed(123) df <- data.frame( A = runif(20, 0, 12), # 最大值12 B = runif(20, 0, 10), # 最大值10 C = runif(20, 0, 4) # 最大值4 ) ggtern(data = df, aes(x = A, y = B, z = C)) + geom_point(size = 2, color = "steelblue") + # 为每个轴设置原始数值的刻度、标签和范围 scale_R_continuous(limits = c(0, 12), breaks = seq(0, 12, 2), labels = seq(0, 12, 2)) + # 对应x轴(右下) scale_T_continuous(limits = c(0, 10), breaks = seq(0, 10, 2), labels = seq(0, 10, 2)) + # 对应y轴(顶部) scale_L_continuous(limits = c(0, 4), breaks = seq(0, 4, 1), labels = seq(0, 4, 1)) + # 对应z轴(左下) # 关键:用adjust参数设置三个轴的最大原始值,让坐标系统匹配原始数据比例 coord_tern(adjust = c(12, 10, 4), expand = FALSE) + labs(x = "A轴", y = "B轴", z = "C轴") + theme_bw()
关键参数解释
scale_R/T_L_continuous:分别对应三元图的右下(R)、顶部(T)、左下(L)轴,这里设置limits为原始数据的范围,breaks和labels用你需要的原始数值刻度。coord_tern(adjust = c(12,10,4)):这个参数告诉ggtern三个轴的相对比例,直接用三个轴的最大值即可,这样坐标系统会按照原始数值的比例来映射,避免自动归一化。expand = FALSE:防止轴范围被自动扩展,确保刻度和数据点的位置完全对应。
补充说明
如果你的数据满足三个变量总和固定(比如每个点的A+B+C等于同一个常数),可以用coord_tern(ternary_sum = 总和值)替代adjust参数,这样会更准确地匹配三元图的传统逻辑。
内容的提问来源于stack exchange,提问作者Richard N. Belcher
相关产品推荐
相关产品推荐

