Haciendo una trama ternaria

Quiero trazar la proyección de datos tridimensionales en su símplex usando ggplot3. Pensé que podría manejar la transformación en coordenadas cartesianas usando coord_trans(), pero no sé cómo hacerlo exactamente.

Esto es lo que probé:

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

Cualquier sugerencia es apreciada. ¡Muchas gracias!

preguntado el 03 de mayo de 12 a las 21:05

7 Respuestas

As mmann1123 resaltado, usando patrón, se puede lograr lo siguiente:

Salida

Con el siguiente bloque de código simple:

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

Respondido el 18 de Septiembre de 19 a las 21:09

Hola @Nicholas! ¿podrías revisar tu respuesta? no soy capaz de reproducirlo... theme_tern_bw es sólo theme_bw Creo, y los puntos se muestran debajo de los bordes (no encima). ¡Gracias por adelantado! - Guilherme Parreira

Claro, hecho, esto era de una versión anterior, ver arriba - Nicolás Hamilton

La función ternaryplot en el paquete vcd hace un buen trabajo al hacer gráficos ternarios clásicos a partir de datos no normalizados:

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

enter image description here

contestado el 04 de mayo de 12 a las 18:05

El paquete R Ternario produce gráficos ternarios a partir de matrices y marcos de datos utilizando las funciones gráficas estándar.

Trama ternaria creada con el paquete R Ternary

La trama anterior se crea con:

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

Respondido el 21 de diciembre de 17 a las 16:12

coord_trans no hace lo que pareces pensar que hace. Transformará las coordenadas x e y de un gráfico que ya es 2D, pero tiene datos 3D.

Simplemente transforme los datos usted mismo y luego grafítelos:

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

Tenga en cuenta que reescribí sus funciones de transformación para que sean más parecidas a R. Además, no deberías pasar expresiones como x = c(x1,x2,x3) dentro de aes(). Asigna una sola variable en su marco de datos a una sola estética.

contestado el 03 de mayo de 12 a las 22:05

Use la biblioteca ggtern, puede leer sobre esto aquí. http://ggtern.com/

Respondido el 12 de diciembre de 13 a las 20:12

Para completar, puede probar el buen viejo ade4 paquete:

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)

Respondido 20 ago 19, 09:08

La función triax.plot(), A partir de la plotrix el paquete también dibuja parcelas ternarias:

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

Respondido el 04 de diciembre de 19 a las 23:12

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.