制作三元图

时间:2012-05-03 20:50:21

标签: r ggplot2

我想使用ggplot2在三维数据上绘制三维数据的投影。我以为我可以使用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" )

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

7 个答案:

答案 0 :(得分:12)

mmann1123 突出显示时,使用ggtern,可以实现以下目标:

Output

使用以下简单的代码块:

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(x1,x2,x3)) + 
  geom_point(fill="red",shape=21,size=4) + 
  theme_tern_bw()

答案 1 :(得分:5)

vcd包中的三元图函数可以很好地用非标准化数据制作经典的三元图:

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

enter image description here

答案 2 :(得分:2)

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

答案 3 :(得分:1)

coord_trans并没有做你认为它做的事情。它将转换已经是2D的图的x和y坐标,但是你有3D数据。

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

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)内传递aes()等表达式。您将数据框中的单个变量映射到单个美学。

答案 4 :(得分:1)

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

Ternary plot created with R package 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')

答案 5 :(得分: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")

答案 6 :(得分:0)

为完整起见,您可以尝试使用旧的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)