2012-05-03 11 views
9

Chcę wykreślić rzut trójwymiarowych danych na ich simpleksie za pomocą ggplot2. Pomyślałem, że mogę zarządzać transformacją na współrzędnych kartezjańskich używając coord_trans(), ale nie wiem jak to zrobić dokładnie.Tworzenie trójskładnikowej fabuły

To co próbowałem:

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

Wszelkie sugestie są mile widziane. Wielkie dzięki!

+0

Patrz także [Jak zainstalować pakiet ggtern w R] (http://askubuntu.com/questions/608519/how-to- install-ggtern-package-in-r) – Dante

Odpowiedz

1

coord_trans nie robi tego, co wydaje się, że tak jest. Przekształci on współrzędne x i y wykresu, który jest już 2D, ale masz dane 3D.

Wystarczy przekształcić dane samodzielnie, a następnie wykreślić go:

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

pamiętać, że przepisał swoje funkcje transformacji być bardziej R-podobne. Ponadto, nie powinieneś przekazywać wyrażeń takich jak x = c(x1,x2,x3) wewnątrz aes(). Mapujesz pojedynczą zmienną w ramce danych do jednej estetyki.

3

Funkcja ternaryplot w pakiecie vcd robi dobrą robotę dokonywania klasyczne trójskładnikowych działek od nieznormalizowaną danych:

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

enter image description here

12

jako mmann1123 zaznaczony za pomocą ggtern dodaje można osiągnąć:

Output

z następującym prostym bloku kodu:

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

Pakiet R Ternary wytwarza trójskładnikowy działki z macierzy i data.frames przy użyciu standardowe funkcje graficzne.

Ternary plot created with R package Ternary

Powyższy wykres jest tworzony z:

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') 
Powiązane problemy