Создание тройного участка

Я хочу построить проекцию трехмерных данных на их симплекс с помощью 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" )

Любые предложения приветствуются. Большое спасибо!

Ответ 1

coord_trans не делает то, что вы, кажется, думаете. Он преобразует координаты x и y графика, который уже 2D, но у вас есть 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-like. Кроме того, вы не должны передавать выражения типа x = c(x1,x2,x3) внутри aes(). Вы сопоставляете одну переменную в вашем кадре данных с одной эстетикой.

Ответ 2

Как подчеркнул 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(x2,x1,x3)) + 
   geom_mask() +
   geom_point(fill="red",shape=21,size=4) + 
   theme_bw() +
   theme_showarrows() +
   theme_clockwise()

Ответ 3

Функция ternaryplot в пакете vcd делает хорошую работу по созданию классических тернарных графиков из ненормированных данных:

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

enter image description here

Ответ 4

Используйте библиотеку ggtern, которую вы можете прочитать здесь. http://ggtern.com/

Ответ 5

Пакет R Ternary создает тройные графики из матриц и data.frames с использованием стандартных графических функций.

Тройной сюжет, созданный с помощью T-пакета R

Вышеприведенный график создается с помощью:

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

Ответ 6

Для полноты вы можете попробовать старый добрый пакет 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)