2013-07-16 4 views
4

모든 빈에 대해 "이 클래스에 속하는 클래스 1과 클래스 2 사이의 비율"이 표시되는 hexbin 플롯을 작성하고 싶습니다 (로그인지 여부).Hexbin : 모든 빈에 대한 함수 적용

x <- rnorm(10000) 
y <- rnorm(10000) 
h <- hexbin(x,y) 
plot(h) 
l <- as.factor(c(rep(1,2000), rep(2,8000))) 

구현 방법에 대한 제안 사항이 있으십니까? bin 통계를 기반으로 모든 bin에 기능을 도입 할 수 있습니까?

답변

3

@ cryo111의 대답은 가장 중요한 성분 - IDs = TRUE입니다. 그 후에는 Inf과 함께하고 싶은 것을 알아내는 것만으로도 비율을 확장하여 예쁜 음모를 생성 할 정수를 얻으려면 얼마가 필요합니까?

library(hexbin) 
library(data.table) 

set.seed(1) 
x = rnorm(10000) 
y = rnorm(10000) 

h = hexbin(x, y, IDs = TRUE) 

# put all the relevant data in a data.table 
dt = data.table(x, y, l = c(1,1,1,2), cID = [email protected]) 

# group by cID and calculate whatever statistic you like 
# in this case, ratio of 1's to 2's, 
# and then Inf's are set to be equal to the largest ratio 
dt[, list(ratio = sum(l == 1)/sum(l == 2)), keyby = cID][, 
    ratio := ifelse(ratio == Inf, max(ratio[is.finite(ratio)]), ratio)][, 
    # scale up (I chose a scaling manually to get a prettier graph) 
    # and convert to integer and change h 
    as.integer(ratio*10)] -> [email protected] 

plot(h) 

enter image description here

+0

아주 좋은 솔루션! – cryo111

+0

안녕하세요. 늦은 답변 죄송합니다. 당신의 솔루션은 무작위 데이터를 위해 완전하게 작동하지만 실제 데이터를 가지고 이상한 행동을 보입니다 - 빈이 클래스 2를 포함하고 있어도 원래 이미지 인 http://i42.tinypic.com/nqa8mb.png와 수정 된 하나의 http : //i42.tinypic.com/5cc5g1.png. 수업은 불균형을 띠기 때문에 너무 많은 상자가 하나의 수업으로 채워지지 않습니다. 이러한 쓰레기통이 바닥으로 이동하는 문제는 무엇일 수 있지만 실제 수업은 맨 위에서 발생합니다. –

+0

@JohnAmraph 작은 재현 할 수있는 예제로 데이터를 필터링하고 OP에서 해당 예제를 게시하는 것이 좋습니다. 코드가 데이터를 가지고있는 경우 – eddi

1

당신은

library(hexbin) 
library(plyr) 
x=rnorm(10000) 
y=rnorm(10000) 
#generate hexbin object with IDs=TRUE 
#the object includes then a slot with a vector cID 
#cID maps point (x[i],y[i]) to cell number cID[i] 
HexObj=hexbin(x,y,IDs = TRUE) 

#find count statistics for first 2000 points (class 1) and the rest (class 2) 
CountDF=merge(count([email protected][1:2000]), 
       count([email protected][2001:length(x)]), 
       by="x", 
       all=TRUE 
      ) 
#replace NAs by 0 
CountDF[is.na(CountDF)]=0 
#check if all points are included 
sum(CountDF$freq.x)+sum(CountDF$freq.y) 

각 빈의 클래스 1, 클래스 2 점의 수를 결정하지만, 그것들을 인쇄하는 것은 또 다른 이야기입니다 수 있습니다. 예를 들어, 하나의 저장소에 클래스 2 점이 없으면 어떻게해야합니까? 그 부분은 정의되지 않았다. 또한, 내가 이해하는 한 hexbin은 단지 2 차원 히스토그램입니다. 따라서 주어진 빈에 속하는 포인트의 수를 계산합니다. 나는 당신의 경우와 같이 정수가 아닌 데이터를 처리 할 수 ​​있다고 생각하지 않는다.