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"))

(若需旋转,基础实现的旋转代码如下:)
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

