Составление троичного сюжета
Я хочу построить проекцию трехмерных данных на их симплекс, используя 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" )
Любые предложения приветствуются. Большое спасибо!
5 ответов
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-подобными. Кроме того, вы не должны передавать такие выражения, как x = c(x1,x2,x3)
Внутри aes()
, Вы отображаете одну переменную в вашем фрейме данных на одну эстетику.
Как подчеркнул 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(x1,x2,x3)) +
geom_point(fill="red",shape=21,size=4) +
theme_tern_bw()
Функция ternaryplot в пакете vcd делает хорошую работу по созданию классических троичных графиков из ненормализованных данных:
require(vcd)
#ternaryplot takes matrices but not data frames
xM <- as.matrix(x)
ternaryplot(xM)
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')
Используйте библиотеку ggtern, о которой вы можете прочитать здесь. http://ggtern.com/
Функция 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")
Для полноты картины можно попробовать старый добрый 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)