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

ggtern三元图负坐标绘图难题:如何实现外部缩放?

用ggtern绘制含负坐标的三元图问题

问题背景

我尝试用ggtern绘制三元图,但部分顶点坐标为负¹,当前生成的图如下:
当前生成的三元图

我需要将ggtern图“缩小”以展示所有点,但ggtern与coord_*系列函数兼容不佳,且输入负值时tern_limits会报错。

基础R/ggplot替代实现

在基础R或ggplot中可以实现需求,但会丢失ggtern的便捷功能,还需手动绘制坐标轴,示例代码如下:

df = tibble(aa = c(1,-6,1), bb= c(1,3,2), cc = c(4,-8,1))

df <- df %>%  mutate(sum = aa + bb + cc,
          aa_s = aa / sum,
          bb_s = bb / sum,
          cc_s = cc / sum,
          xcoord = sqrt(3)/2*cc_s,
          ycoord = (bb_s-aa_s)/2 ) 
      
frame = tibble(x=c(0,0.5,1,0),y=c(0,sqrt(3)/2,0,0))

df %>% ggplot()+
  geom_point(aes(x=xcoord,y=ycoord))+
  geom_path(data=frame,aes(x=x,y=y))+
  theme_void()+coord_equal(xlim=c(0,1),ylim=c(-1,1))+
  annotate(geom="text",x=c(-0.05,0.5,1.05),y=c(0,0.9,0),label=c("AA","BB","CC"))

ggplot实现的预期效果

(若需旋转,基础实现的旋转代码如下:)

Xr <- ( X * cospi(rotation / 180) - Y * sinpi(rotation / 180) ) 
Yr <- ( X * sinpi(rotation / 180) + Y * cospi(rotation / 180) ) 

而ggtern中旋转更简单,只需添加+ theme_rotate(degrees = rotation)即可。

ggtern尝试的错误情况

尝试用ggtern直接设置极限时:

ggtern(df,aes(x=aa,y=bb,z=cc))+
  geom_point()+
  tern_limit(T=1,L=-6,R=-8)

触发错误:

Erreur : Invalid Ternary Limits, Each Point Must Sum to Unity... De plus : Message d'avis : Solution to limits produces range outside of [0,1] for some scale

调整参数为tern_limit(6,-2,-3)时,报错:

Invalid limits, solution produces zero ranges on some scales

这符合ggtern的默认逻辑(仅支持三角形内部缩放,不支持外部),但无法满足我的需求。


¹ 注:部分场景下,负坐标及三角形外的点是合理的。若对投影与坐标映射感兴趣,可参考Spear FS (1994)所著《Metamorphic phase equilibria and pressure–temperature-time paths》(美国矿物学会,华盛顿,共799页,第5章),以及我发表的论文(DOI:10.1016/j.lithos.2016.09.018)。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.17 04:07:17