2016-07-02 5 views
4

나는 data file에 3 차원 플롯에 "히트 맵"을 그리기에 충분한 데이터 포인트가 있습니다.ggtern contour plot in R

enter image description here

내가 다음 ggtern를 사용하여 뭔가를 얻으려면 :

여기
library(ggtern) 
library(reshape2) 

N=90 
trans.prob = as.matrix(read.table("./N90_p_0.350_eta_90_W12.dat",fill=TRUE)) 
colnames(trans.prob) = NULL 

# flatten trans.prob for ternary plot 
flattened.tb = melt(trans.prob,varnames = c("x","y"),value.name = "W12") 
# delete rows with NA 
flattened.tb = flattened.tb[complete.cases(flattened.tb),] 
flattened.tb$x = (flattened.tb$x-1)/N 
flattened.tb$y = (flattened.tb$y-1)/N 
flattened.tb$z = 1 - flattened.tb$x - flattened.tb$y 

ggtern(data = flattened.tb, aes(x=x,y=y,z=z)) + 
    geom_point(size=1, aes(color=W12)) + 
    theme_bw() + 
    scale_color_gradient2(low = "green", mid = "yellow", high = "red") 

은 내가 가진 것입니다 (정말 충분한 데이터 포인트 만 산포도 열지도, 아니다)

enter image description here

내 질문 : ggtern을 사용하여 두 번째 그림과 같은 것을 어떻게 얻을 수 있습니까?

편집 1 : 파일 이름이 잘못되었습니다. 나는 파일 이름을 고쳤다. 데이터 파일에 여기에 직접 붙여 넣을 수있는 데이터 포인트가 너무 많습니다.

두 번째 그림은 타사 Matlab 패키지 ternplot에 의해 작성되었습니다. 내 첫 번째 그림에서 히트 맵보다는 이산 라인이있는 3 차원 등고선을 원합니다. 보다 구체적으로, 등고선 목록을 지정하고자합니다. 예 : W12=0.05,0.1,0.15,.... 나는 geom_density_terngeom_interpolate_tern으로 몇 시간 동안 놀았지만, 내가 원하는 것을 얻는 방법을 아직 모른다.

MATLAB 코드 :

[HCl, Hha, cax] = terncontour(X,Y,1-X-Y,data,[0.01,0.1,0.2,0.3,0.4,0.5]); 
X,Y,1-X-Y가 플롯상의 좌표 지정

data 저장 값과 벡터의 윤곽 값을 지정

.

+1

가 해킹-R @, 내 최신 편집에 첫 두 의견을 해결. – wdg

+0

대단히 감사합니다. 이 질문에 대해 걱정할 필요는 없지만 나중에 참조 할 수 있도록 이해하기 위해 데이터 자체를 붙여 넣기를 원하지는 않지만 데이터의 '출력'또는 너무 길면 GitHub 또는 PasteBin (등) ** 또는 **의 데이터의'dput '에 대한 링크는 새로운 예제 데이터를 만들거나 패키지에 내장 된 데이터 세트 ('data()')를 사용하는 것이 더 좋습니다. –

+0

@ Hack-R, 나는 그 기사를 철저히 읽었다. 그건 내가 원하는 것이 아니야. 나는 웹 사이트 ggtern.com을 통해서도 갔다. 내 사건과 관련된 예를 찾을 수 없었다. 필자의 경우 전체 공간의 모든 점에 대해 정확히 하나의 값을 갖는다. – wdg

답변

4

WDG, 나는 더 나은 처리 단지 크랑에 제출되었습니다 모델링의이 유형을 위해, ggtern하는 몇 가지 작은 변화를 만들어, 그래서 다음날 정도에 걸쳐 사용할 수 있습니다. 잠시 동안, 내 BitBucket 계정의 소스에서 다운로드 할 수 있습니다 : https://bitbucket.org/nicholasehamilton/ggtern

어쨌든, 다음은 ggtern 버전 2.1.2에서 작동하는 소스입니다.

Result

:

library(ggtern) 
library(reshape2) 

N=90 
trans.prob = as.matrix(read.table("~/Downloads/N90_p_0.350_eta_90_W12.dat",fill=TRUE)) 
colnames(trans.prob) = NULL 

# flatten trans.prob for ternary plot 
flattened.tb = melt(trans.prob,varnames = c("x","y"),value.name = "W12") 
# delete rows with NA 
flattened.tb = flattened.tb[complete.cases(flattened.tb),] 
flattened.tb$x = (flattened.tb$x-1)/N 
flattened.tb$y = (flattened.tb$y-1)/N 
flattened.tb$z = 1 - flattened.tb$x - flattened.tb$y 

############### MODIFIED CODE BELOW ############### 

#Remove the (trivially) Negative Concentrations 
flattened.tb = subset(flattened.tb,z >= 0) 

#Plot a series of plots in increasing polynomial degree 
plots = lapply(seq(3,18,by=3),function(x){ 
    degree = x 
    breaks = seq(0.025,0.575,length.out = 10) 
    base = ggtern(data = flattened.tb, aes(x=x,y=y,z=z)) + 
    geom_point(size=1, aes(color=W12),alpha=0.05) + 
    geom_interpolate_tern(aes(value=W12,color=..level..), 
          base = 'identity',method = glm, 
          formula = value ~ polym(x,y,degree = degree,raw=T), 
          n = 150, breaks = breaks) + 
    theme_bw() + 
    theme_legend_position('topleft') + 
    scale_color_gradient2(low = "green", mid = "yellow", high = "red", 
          midpoint = mean(range(flattened.tb$W12)))+ 
    labs(title=sprintf("Polynomial Degree %s",degree)) 
    base 
}) 

#Arrange the plots using grid.arrange 
png("~/Desktop/output.png",width=700,height=900) 
    grid.arrange(grobs = plots,ncol=2) 
garbage <- dev.off() 

이것은 다음 출력을 생성

은 정말 한 보간 형상 경과 한 대표 관찰 할 수있다 (약한 알파 값) 아래의 점을 포함했다

샘플 MATLAB 등고선과 같이 색상 및 방향에 가까운 다이어그램을 만들기 위해 다음을 시도하십시오.

plots = lapply(seq(3,18,by=3),function(x){ 
    degree = x 
    breaks = seq(0.025,0.575,length.out = 10) 
    base = ggtern(data = flattened.tb, aes(x=z,y=y,z=x)) + 
    geom_point(size=1, aes(color=W12),alpha=0.05) + 
    geom_interpolate_tern(aes(value=W12,color=..level..), 
          base = 'identity',method = glm, 
          formula = value ~ polym(x,y,degree = degree,raw=T), 
          n = 150, breaks = breaks) + 
    theme_bw() + 
    theme_legend_position('topleft') + 
    scale_color_gradient2(low = "darkblue", mid = "green", high = "darkred", 
          midpoint = mean(range(flattened.tb$W12)))+ 
    labs(title=sprintf("Polynomial Degree %s",degree)) 
    base 
}) 
png("~/Desktop/output2.png",width=700,height=900) 
    grid.arrange(grobs = plots,ncol=2) 
garbage <- dev.off() 

이 다음과 같은 출력을 생성합니다

Result2

4

이것은 당신의 예로서 아름다운 보이지 않는, 그러나 희망이 당신에게 당신이 원하는 곳으로 상당히 가까워지고 :

flattened.tb$a <- 0 
flattened.tb$a[flattened.tb$W12 > 0.04 & flattened.tb$W12 < .05] <- 1 

flattened.tb$b <- 0 
flattened.tb$b[flattened.tb$W12 > 0.05 & flattened.tb$W12 < .06] <- 1 

flattened.tb$c <- 0 
flattened.tb$c[flattened.tb$W12 > 0.07 & flattened.tb$W12 < .08] <- 1 

flattened.tb$d <- 0 
flattened.tb$d[flattened.tb$W12 > 0.09 & flattened.tb$W12 < .1] <- 1 


options("tern.discard.external" = F) 
ggtern(data = flattened.tb, aes(x, y, z)) + 
    geom_line(aes(a),color="red",linetype=1) + 
    geom_line(aes(b),color="blue",linetype=1) + 
    geom_line(aes(c),color="yellow",linetype=1) + 
    geom_line(aes(d),color="green",linetype=1) + 
    theme_bw() 

플롯은 단지 최대 prettying이 필요합니다. 어떤 데이터 영역이 플로팅에 가장 적합하다고 말할 수는 없습니다.

enter image description here