2014-11-25 4 views
0

간단한 문제가 있습니다. 나는 산란 음모가있다. 커스텀 수식을 사용하여 주위에 자신감 선을 그립니다. 자, 컷오프 라인 바깥에있는 이름 만 안에 아무것도 표시되지 않도록하고 싶습니다. 그러나 라인 코디네이트 기반으로 데이터를 서브 세트 화하는 방법을 알 수는 없습니다.R 도표에서 곡선 외부의 후보/oulier 찾기 및 레이블 지정

줄은 128x 및 y 값의 벡터 인 lines 함수를 사용하여 플롯됩니다. 자,이 두 값을 기반으로 데이터 (x, y 점)를 어떻게 서브 세트 할 수 있습니까? 1,2 또는 3과 같은 하나의 하위 설정 데이터에 대해 정적 제한을 적용 할 수 있지만 데이터를 부분 집합 화하는 데 벡터를 사용하는 방법을 고수했습니다.

enter image description here

재현 예를 들어, 고려 :

df=data.frame(x=seq(2,16,by=2),y=seq(2,16,by=2),lab=paste("label",seq(2,16,by=2),sep='')) 
plot(df[,1],df[,2]) 

# adding lines 
lines(seq(1,15),seq(15,1),lwd=1, lty=2) 

# adding labels 
text(df[,1],df[,2],labels=df[,3],pos=3,col="red",cex=0.75) 

지금, 난 그냥 외부 또는 선을 교차있는 라벨을해야합니다.

라인에 사용 된 값을 사용하여 데이터 프레임의 하위 세트를 만들려고했으나 제대로 만들 수 없습니다.

이제 정적 하위 설정은 df[which(df[,1]>8 & df[,2]>8),]과 같은 단일 값에 대해 수행 할 수 있지만 전체 목록에 대해 수행하는 방법은 다음과 같습니다.

나는 또한 반복적으로 df의 라인에 사용 된 x와 y의 모든 값을 순환 시키려고했지만 대부분의 값은 한도에서는 + ve가되고 다른 값에서는 false가된다. 그들이 완전히 다르기 때문에 나는 당신의 초기 화산 형 그래프의 문제가 아니라 만들어 하나에 대해 말하는 것입니다

enter image description here 감사

+0

지금까지 해보신 것은 무엇입니까? [최소한의 재생산 가능한 예제] (http://stackoverflow.com/questions/5963269/how-to-make-a-great-r-reproducible-example/5963610#5963610)가 좋을 것입니다. 이렇게하면 다른 사람들이 당신을 도울 수있게됩니다. – Jaap

+0

맞아, 빨리 추가 할게. 감사합니다 –

답변

1

.

저는 정말 이것을 많이 생각했으며 확고한 결론에 도달했다고 생각합니다. 두 가지 옵션이 있습니다 : 1. 정말 쉽게 작업 할 수있는 선 방정식을 알고 있습니다. 2. 라인 수식을 모른다는 것은 근사치로 작업해야 함을 의미합니다.

일부 기하 :

함수는 라인의 방정식을 나타낸다. Y>는 수학 식의 우변는 X의 경우 통과 할 때 소정의 좌표 값 쌍 (x, y)의 경우, 그 점은 라인 아래 다른 선 위에있다. 같은 개념은 당신이 곡선을 가지고 있다면 의미한다. 당신이 방정식이있는 경우

그런 다음 아래 내 코드에서 위를 쉽게 할 수 당신이 설정됩니다. 그렇지 않다면 커브를 근사 할 필요가 있습니다. 이렇게하려면 다음 코드가 필요합니다.

df=data.frame(x=seq(2,16,by=2),y=seq(2,16,by=2),lab=paste("label",seq(2,16,by=2),sep='')) 

make_vector <- function(df) { 
lab <- vector() 
for (i in 1:nrow(df)) { 
    this_row <- df[i,] #this will contain the three elements per row 
    if ((this_row[1] < max(line1x) & this_row[2] > max(line1y) & this_row[2] < a + b*this_row[1]) 
     | 
     (this_row[1] > min(line2x) & this_row[2] > max(line2y) & this_row[2] > a + b*this_row[1])) { 
    lab[i] <- this_row[3] 
    } else { 
    lab[i] <- <NA> 
    } 
} 
return(lab) 
} 
#this_row[1] = your x 
#this_row[2] = your y 
#this_row[3] = your label 



df$labels <- make_vector(df) 


plot(df[,1],df[,2]) 

# adding lines 
lines(seq(1,15),seq(15,1),lwd=1, lty=2) 

# adding labels 
text(df[,1],df[,2],labels=df[,4],pos=3,col="red",cex=0.75) 

중요한 비트가 기능입니다. 당신은 X, Y 및 연구실을 만든 당신이 DF 것을 상상해보십시오. 당신은 또한 X와 벡터를해야합니다, y는 1 호선과 X 좌표, Y는 2 호선 좌표. 이이 좀 끔찍하며 (아래 그래프처럼 뭔가를 만들 것입니다

this_row[1] < max(line1x) & this_row[2] > max(line1y) & this_row[2] < a + b*this_row[1] 
#translates to: 
#this_row[1] < max(line1x) = your x needs to be less than the max x (vertical line in graph below 
#this_row[2] > max(line1y) = your y needs to be greater than the max y (horizontal line in graph below 
#this_row[2] < a + b*this_row[1] = your y needs to be less than the right hand side of the equation (to have a point above i.e. left of the line) 
#check below what the line is 

:

의가 (같은 위의 코드를 구현 라인이 존재)에만 1 호선의 상태를 보자 확대되었지만 단지 참고 용 일뿐입니다.) 당신의 라인을 근사를 시각화 :

enter image description here

위의 코드는 삼각형 위의 지역과 Y = 1이고, x = 1 개 라인 내에서 모든 점을 선택합니다. 마지막 식

:

'는 2 점을 갖는 두 방정식 2 개 파라미터 A 및 B의 시스템을 해결하는 라인의 방정식을 알아낼 수 좌표. (각 점에 대해 y, a를 x로 대체하여 y = a + bx)

선택하려는 두 점은 첫 번째 선 (line1)의 탄젠트에 가장 가까운 두 점입니다. 귀하의 데이터에 따라 임의로 선택하십시오. 접선에 가장 가까운 것이 좋습니다. 그 자리와 안구를 그려보세요.

위의 모든 작업을 완료 한 후에는 라벨이 적어집니다 (대략 적음).

그리고 그게 당신이 할 수있는 유일한 방법입니다!

긴 이야기지만 도움이 되길 바랍니다.

P. 데이터가 없으므로 코드를 테스트하지 않았습니다.

+0

아니요, 문제는 플로팅이 아닌 부분 집합입니다. 당신은 그것을 올바르게하지 않았고, 값 8을 사용하여 부분 집합을 만들었지 만, 대신 15 개의 요소를 포함하는 벡터가 있습니다. 이렇게, 무언가는 df $ labels [(df [, 1]> seq (1,15) & df [, 2]> seq (1,15))]':) –

+0

나는 시험을 치러 라. 어떻게 상태의 테스트가 발생합니까? seq (1,15)의 각 요소에 대해 df [, 1]의 각 요소? 1vs1? 나는 이것이 아마도 당신이 의미하는 바라고 생각합니다. 이것은 의미가 있습니다. – LyzandeR

+0

아뇨 미안하지만 난 아직도 못해 .... 당신은 시험을 원할 것 같은데 설명 할 필요가있어. – LyzandeR