You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

ggtern三元图轴缩放范围设置失效问题求助

三元图轴缩放范围调整问题

我用以下代码绘制三元图:

library(ggtern)

data()
Coal

ggtern(data = Coal, aes(x = Reflectance, y = `H/O`, z = `O/C`)) +
  geom_point(aes(color = Feedstock), size = 3) +
  theme_rgbw()

(配图为三元图)

我的数据集数值范围在0.010到4.41之间,希望调整三元图的轴缩放范围。我尝试了以下代码但没有效果:

Tlim(c(min(Coal$`O/C`), max(Coal$`O/C`))) +  # 调整Z轴范围
  Rlim(c(min(Coal$Reflectance), max(Coal$Reflectance))) +  # 调整X轴范围
  Llim(c(min(Coal$`H/O`), max(Coal$`H/O`)))

以下是我实际使用的数据集:

Feedstock   Reflectance   H/O    O/C
wheat straw     0,20    0,120   0,976
wheat straw     0,72    0,040   0,380
wheat straw     1,44    0,041   0,369
wheat straw     2,03    0,033   0,309
wheat straw     2,99    0,020   0,273
wheat straw     3,88    0,012   0,183
sycamore wood   0,20    0,114   0,837
sycamore wood   0,84    0,054   0,333
sycamore wood   1,52    0,035   0,237
sycamore wood   2,17    0,026   0,153
sycamore wood   3,51    0,021   0,124
sycamore wood   3,90    0,010   0,091
peanut shells   0,20    0,136   0,588
peanut shells   0,77    0,064   0,390
peanut shells   1,43    0,043   0,233
peanut shells   2,37    0,027   0,133
peanut shells   3,62    0,017   0,104
peanut shells   4,41    0,010   0,076

请求帮助如何正确设置该三元图的轴缩放范围。


解决方法

首先明确:三元图的核心规则是三个轴的数值之和必须为固定常数(默认是1),这是你之前调整轴范围无效的关键原因。另外,Tlim/Rlim/Llim的用法有误,这些函数需要作为图层添加到绘图链中,不能单独使用。具体解决步骤如下:

  1. 修正数据格式
    你的数据集用逗号作为小数点分隔符,R默认识别为字符型,会导致后续计算错误,先转换格式:

    # 读取并修正数据小数点格式
    Coal <- read.table(text = "Feedstock   Reflectance   H/O    O/C
    wheat straw     0,20    0,120   0,976
    wheat straw     0,72    0,040   0,380
    wheat straw     1,44    0,041   0,369
    wheat straw     2,03    0,033   0,309
    wheat straw     2,99    0,020   0,273
    wheat straw     3,88    0,012   0,183
    sycamore wood   0,20    0,114   0,837
    sycamore wood   0,84    0,054   0,333
    sycamore wood   1,52    0,035   0,237
    sycamore wood   2,17    0,026   0,153
    sycamore wood   3,51    0,021   0,124
    sycamore wood   3,90    0,010   0,091
    peanut shells   0,20    0,136   0,588
    peanut shells   0,77    0,064   0,390
    peanut shells   1,43    0,043   0,233
    peanut shells   2,37    0,027   0,133
    peanut shells   3,62    0,017   0,104
    peanut shells   4,41    0,010   0,076", header = TRUE, dec = ",")
    
  2. 保留原始数值比例的轴范围设置
    如果不想归一化数据,需要先计算数据的最大行总和,将其设为三元图的总和基准,再配合Tlim/Rlim/Llim设置轴范围:

    library(ggtern)
    
    # 计算所有样本的最大行总和,作为三元图的总和基准
    max_total <- max(rowSums(Coal[, c("Reflectance", "H/O", "O/C")]))
    
    ggtern(data = Coal, aes(x = Reflectance, y = `H/O`, z = `O/C`)) +
      geom_point(aes(color = Feedstock), size = 3) +
      # 分别设置三个轴的范围
      Rlim(c(0, max(Coal$Reflectance))) +  # X轴(Reflectance)
      Llim(c(0, max(Coal$`H/O`))) +        # Y轴(H/O)
      Tlim(c(0, max(Coal$`O/C`))) +        # Z轴(O/C)
      # 指定三元图的总和基准
      coord_tern(sum = max_total) +
      theme_rgbw()
    
  3. 归一化后的标准三元图设置
    若要使用标准三元图(总和为1),先对数据归一化,再设置轴范围:

    # 按行归一化数据,使每行三个变量之和为1
    Coal_normalized <- Coal
    Coal_normalized[, c("Reflectance", "H/O", "O/C")] <- 
      apply(Coal[, c("Reflectance", "H/O", "O/C")], 1, function(row) row / sum(row))
    
    ggtern(data = Coal_normalized, aes(x = Reflectance, y = `H/O`, z = `O/C`)) +
      geom_point(aes(color = Feedstock), size = 3) +
      # 可自定义归一化后的轴范围,默认是0到1
      Rlim(c(0, max(Coal_normalized$Reflectance))) +
      Llim(c(0, max(Coal_normalized$`H/O`))) +
      Tlim(c(0, max(Coal_normalized$`O/C`))) +
      theme_rgbw()
    

关键注意点

  • 三元图必须满足三个变量之和为固定值,忽略这个规则会导致轴范围设置失效。
  • Tlim/Rlim/Llim是ggtern的图层函数,必须添加到绘图对象的图层链中才能生效。
  • 数据的小数点格式必须与R的默认格式一致(点分隔),否则会被识别为字符型数据,无法进行数值计算。

内容的提问来源于stack exchange,提问作者DCE

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.14 20:55:59