11

我想使用 ggplot2 在它们的单纯形上绘制 3 维数据的投影。我以为我可以使用 来管理笛卡尔坐标上的转换coord_trans(),但不知道该怎么做。

这是我尝试过的:

simplex.y  <- function( x1, x2, x3 ) {
  return( sqrt(0.75) *  x3 / (x1+x2+x3) )
} 
simplex.x  <- function( x1, x2, x3 ) {
  return( (x2 + 0.5 * x3) / (x1+x2+x3) )
}

x  <- data.frame(
  x1 = c( 0, 0, 1, 0.1, 0.6, 0.2 ),
  x2 = c( 0, 1, 0, 0.3, 0.2, 0.8 ),
  x3 = c( 1, 0, 0, 0.6, 0.2, 0.0 )
)

require(ggplot2)
ggplot( data = x, aes( x = c(x1, x2, x3), y = c(x1, x2, x3)) ) +
  geom_point() +
  coord_trans( x="simplex.x", y="simplex.y" )

任何建议表示赞赏。非常感谢!

4

7 回答 7

17

正如mmann1123强调的那样,使用ggtern可以实现以下目标:

输出

使用以下简单的代码块:

x  <- data.frame(
  x1 = c( 0, 0, 1, 0.1, 0.6, 0.2 ),
  x2 = c( 0, 1, 0, 0.3, 0.2, 0.8 ),
  x3 = c( 1, 0, 0, 0.6, 0.2, 0.0 )
)

ggtern(data=x,aes(x2,x1,x3)) + 
   geom_mask() +
   geom_point(fill="red",shape=21,size=4) + 
   theme_bw() +
   theme_showarrows() +
   theme_clockwise()
于 2013-12-30T01:28:59.717 回答
6

vcd 包中的 ternaryplot 函数可以很好地从非归一化数据中制作经典的三元图:

require(vcd)
#ternaryplot takes matrices but not data frames
xM <- as.matrix(x)
ternaryplot(xM)

在此处输入图像描述

于 2012-05-04T17:01:54.903 回答
2

R 包Ternary使用标准图形函数从矩阵和 data.frames 生成三元图。

使用 R 包 Ternary 创建的三元图

上面的情节是通过以下方式创建的:

x  <- data.frame(
  x1 = c( 0, 0, 1, 0.1, 0.6, 0.2 ),
  x2 = c( 0, 1, 0, 0.3, 0.2, 0.8 ),
  x3 = c( 1, 0, 0, 0.6, 0.2, 0.0 )
)
TernaryPlot()
TernaryPoints(x, col='red')
于 2017-12-21T16:42:55.113 回答
1

使用您可以在此处阅读的 ggtern 库。 http://ggtern.com/

于 2013-12-12T20:23:34.483 回答
1

coord_trans不像你认为的那样做。它将转换已经是 2D 但您有 3D 数据的绘图的 x 和 y 坐标。

只需自己转换数据,然后绘制它:

simplex.y  <- function(x) {
  return( sqrt(0.75) *  x[3] / sum(x) )
} 
simplex.x  <- function(x) {
  return( (x[2] + 0.5 * x[3]) / sum(x) )
}

x  <- data.frame(
  x1 = c( 0, 0, 1, 0.1, 0.6, 0.2 ),
  x2 = c( 0, 1, 0, 0.3, 0.2, 0.8 ),
  x3 = c( 1, 0, 0, 0.6, 0.2, 0.0 )
)

newDat <- data.frame(x = apply(x,1,simplex.x),
                y = apply(x,1,simplex.y))

ggplot(newDat,aes(x = x,y = y)) + 
    geom_point()

请注意,我将您的转换函数重写为更像 R。此外,您不应该传递像x = c(x1,x2,x3)inside of这样的表达式aes()。您将数据框中的单个变量映射到单个美学。

于 2012-05-03T21:50:51.593 回答
1

为了完整起见,您可以尝试使用旧ade4包:

x  <- data.frame(
  x1 = c( 0, 0, 1, 0.1, 0.6, 0.2 ),
  x2 = c( 0, 1, 0, 0.3, 0.2, 0.8 ),
  x3 = c( 1, 0, 0, 0.6, 0.2, 0.0 )
)

require(ade4)
triangle.plot(x)
于 2019-08-20T08:49:17.393 回答
1

包中的函数triax.plot(),plotrix还绘制三元图:

require(plotrix)

x  <- data.frame(
  x1 = c( 0, 0, 1, 0.1, 0.6, 0.2 ),
  x2 = c( 0, 1, 0, 0.3, 0.2, 0.8 ),
  x3 = c( 1, 0, 0, 0.6, 0.2, 0.0 )
)

triax.plot(x, pch=16,col.symbols="red")
于 2019-12-04T23:50:49.533 回答