如何在ggtern中使用原始数据的轴范围和标签?

7
我正在使用R中的ggtern制作三元图,希望在ggtern图中与原始数据相同地具有坐标轴标签和刻度。对于以下代码中生成的数据,每个轴的最大值为12、10和4。
继上一篇文章后,我尝试使用breaks和labels来实现此目的,但仍然存在问题:每个轴仍位于0-1比例尺上,由于它们超过了1,因此缺少标签,并且带有标签的轴线不与图中的点相交。(如何更改由ggtern制作的三元图的标签?
library(ggtern)
labFnc <- function(x,digits=2) format(round(unique(x),digits),digits=digits)

mydata <- data.frame(
  x = runif(50, min = 0.25, max = 12),
  y = runif(50, min = 0.1, max = 10),
  z = runif(50, min = 0.5, max = 4),
  value = runif(50, min = 10000, max = 20000))

ggtern(data = mydata,aes(x = x, y = y, z = z,col=value)) + 
  theme_bw() +
  geom_point(alpha = 0.8, size = 3) +
  theme_showarrows() +
  scale_T_continuous(breaks=unique(mydata$x),labels=labFnc(mydata$x))+ 
  scale_L_continuous(breaks=unique(mydata$y),labels=labFnc(mydata$y))+ 
  scale_R_continuous(breaks=unique(mydata$z),labels=labFnc(mydata$z))

在这里输入图片描述

有没有办法做到这一点?非常感谢您的帮助。

编辑:我还尝试了添加tern_limits参数。虽然看起来可以按比例扩展图形,但数据位置不正确。而且我不能像之前那样添加自己独特的间断点。

ggtern(data = mydata,aes(x = x, y = y, z = z,col=value)) + 
  theme_bw() +
  geom_point(alpha = 0.8, size = 3) +
  theme_showarrows() +
  tern_limits(T=12, L=10, R=4)

enter image description here


1
http://www.ggtern.com/d/2.2.2/tern_limits.html - Nicholas Hamilton
谢谢你的评论,Nicholas。顺便说一句,这是一个很棒的包。我尝试使用tern_limits,但它把我的所有数据都放在了图形的中间。我已经更新了我的问题并提供了这些信息。 - Richard N. Belcher
limit_tern(...)函数中的参数应该是分数,即[0,1]之间的值,我会发布一个例子。 - Nicholas Hamilton
1个回答

7
您提供的解决方案是正确的,但是limit_term(...)函数(或别名)的所有参数都应在[0,1]范围内,对应于[0,100%]。可以提供超出此范围的值,但这将用于解析包含大于100%和小于0%的值的限制。
总之,请使用以下内容:
tern_limits(T=12, L=10, R=4)

实际上是要求将三元限制分别绑定为1200%,1000%和400%的最大值,这正是您尝试的结果已呈现的方式。

无论如何,以下是limits_ternzoom功能的一些示例。

library(ggtern)

n  = 100
df = data.frame(id=1:n,
                x=runif(n),
                y=runif(n),
                z=runif(n))
base = ggtern(df,aes(x,y,z,color=id)) + geom_point(size=3)
base

#Top Corner
base + limit_tern(1.0,0.5,0.5)

#Left Corner
base + limit_tern(0.5,1.0,0.5)

#Right Corner
base + limit_tern(0.5,0.5,1.0)

#Center Zoom Convenience Function
base + theme_zoom_center(0.4) # Zoom In
base + theme_zoom_center(0.6) # Zoom In
base + theme_zoom_center(0.8) # Zoom In
base + theme_zoom_center(1.0) ##Default as per no zoom
base + theme_zoom_center(1.2) # Zoom Out
base + theme_zoom_center(1.4) # Zoom Out
base + theme_zoom_center(1.6) # Zoom Out
base + theme_zoom_center(1.8) # Zoom Out
base + theme_zoom_center(2.0) # Zoom Out

#Left Zoom Convenience Function 
#   (try theme_zoom_R and theme_zoom_T for Right and Top respectively)
base + theme_zoom_L(0.4) # Zoom In
base + theme_zoom_L(0.6) # Zoom In
base + theme_zoom_L(0.8) # Zoom In
base + theme_zoom_L(1.0) ##Default as per no zoom
base + theme_zoom_L(1.2) # Zoom Out
base + theme_zoom_L(1.4) # Zoom Out
base + theme_zoom_L(1.6) # Zoom Out
base + theme_zoom_L(1.8) # Zoom Out
base + theme_zoom_L(2.0) # Zoom Out

注意:这些都是方便函数,使缩放比独立控制限制更容易(通过scale_X_continuous(...) [X = T,L,R]是有效的)。与纯笛卡尔坐标系不同,在三元系统中,限制必须有意义,以便三个顶点满足单纯形条件。

如果您需要独立控制每个轴,则以下是一个示例,其中定义了每个限制、轴中断和轴标签,分别用于T、L和R轴。如果极限在单纯形条件方面毫无意义,则会引发错误。

ggtern() + 
  scale_T_continuous(limits=c(0.5,1.0),
                     breaks=seq(0,1,by=0.1),
                     labels=LETTERS[1:11]) + 
  scale_L_continuous(limits=c(0.0,0.5),
                     breaks=seq(0,1,by=0.1),
                     labels=LETTERS[1:11]) +
  scale_R_continuous(limits=c(0.0,0.5),
                     breaks=seq(0,1,by=0.1),
                     labels=LETTERS[1:11])

谢谢Nicholas,我现在明白你需要满足单纯形条件。另一个问题是轴标签。我可以理解一个点可能在其范围内有一个%值。比如说一个点位于X 10%处,但实际数据点是2.4。是否有一种简单的方法来更改轴标签,使得刻度线出现在10%的位置,但文本显示为2.4(而不是10%)?这可以在inkscape中手动完成,使用类似于我在问题中放置的链接的方法。 - Richard N. Belcher
1
@RichardN.Belcher,我已经提供了一个展示完全自定义的例子。 - Nicholas Hamilton

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接