2011-10-12 2 views
4

n 좌표 쌍의 목록을 보려면 x, y 특정 색상의 서로 다른 점 사이의 선을 플로팅하는 방법이 있습니까? 라인 플롯의 특정 세그먼트에 대한 색상을 선택하는 우아한 방법은 무엇입니까?

지금까지 구현 한 솔루션

음모를 기능을하지만 색상을하려는 범위를 선택 라인를 사용하지 않는 것입니다. 예 :

x <- 1:100 
y <- rnorm(100,1,100) 
plot(x,y ,type='n') 
lines(x[1:50],y[1:50], col='red') 
lines(x[50:60],y[50:60], col='black') 
lines(x[60:100],y[60:100], col='red') 

더 쉬운 방법이 있나요?

답변

7

예, 이것을 수행하는 한 가지 방법은 ggplot을 사용하는 것입니다.

ggplot은 데이터가 data.frame 형식이어야합니다. 이 data.frame에 원하는 색상을 나타내는 열 col을 추가합니다. 안부 변수가 이미 색이므로 플롯이어서 ggplot, geom_linescale_colour_identity로 구성된다

library(ggplot2) 

df <- data.frame(
    x = 1:100, 
    y = rnorm(100,1,100), 
    col = c(rep("red", 50), rep("black", 10), rep("red", 40)) 
) 

ggplot(df, aes(x=x, y=y)) + 
    geom_line(aes(colour=col, group=1)) + 
    scale_colour_identity() 

enter image description here

보다 일반적으로, 각 라인 세그먼트는 서로 다른 색상 일 수있다.

df <- data.frame(
    x = 1:100, 
    y = rnorm(100,1,100) 
) 

ggplot(df, aes(x=x, y=y)) + geom_line(aes(colour=x)) 

enter image description here


그리고 당신은 기본 그래픽을 사용하여 주장하는 경우, 다음 사용 : 다음 예에서 나는 원활 파란색에서 빨간색으로 색상을 변경 플롯을주고, x 값에 색상을 매핑 segments으로는 다음과 같습니다

df <- data.frame(
    x = 1:100, 
    y = rnorm(100,1,100), 
    col = c(rep("red", 50), rep("black", 10), rep("red", 40)) 
) 

plot(df$x, df$y, type="n") 
for(i in 1:(length(df$x)-1)){ 
    segments(df$x[i], df$y[i], df$x[i+1], df$y[i+1], col=df$col[i]) 
} 

enter image description here

+0

무엇, 아니'lattice' 솔루션? ;) – joran

+0

세그먼트 솔루션에 대해 이것은 for 루프를 사용하는데, 이것은 OP와 같이'lines '을 여러 번 호출하는 것과 같습니다. 당신은 더 우아한 방법을 사용할 수 있습니다 :'with (df, segments (head (x, -1), head (y, -1), x [-1], y [-1], rep (c ("red" "파랑", "녹색"), c (50, 10, 40)))). – TMS

+0

@ joran : 네가 농담에 빠졌음을 나는 안다. 그러나 격자는 여기에서 짧은 절름발이가되는 것 같다. 내 대답을 보라. – Aaron

0

기본 라이브러리에서 그렇게 생각하지 않습니다 (그러나 ggplot 등은 말할 수 없습니다). lines 함수를보고 col을 벡터로 제공하려고 시도하면 ... 작동하지 않습니다. 나는 너와 똑같이 할거야.

Andrie와 논의 후 편집 및 his post 영감 : 당신은 하나의 호출을 할 segments()을 사용하여이 토론을 볼 수 있습니다.

+1

흥미롭게도 'p'유형의 플롯은 이러한 방식으로 작동합니다. 'plot (x, y, type = "p", col = ifelse (x <10, "pink", "green"))'을 고려하십시오. – Chase

+0

기본 그래픽 :'help (plotrix :: color.scale.lines) ' –

+0

@Chase, wow, interesting! +1! – TMS

2

x 값 대신 y 값을 기준으로 색상을 설정하려면 plotrix::clplot을 사용하십시오. 그것은 환상적이고 훌륭하고 훌륭한 기능입니다. 면책 조항 : 나는 그것을 썼다 :-). clplot()은 y가 지정된 값 범위를 차지하는 데이터 영역을 강조 표시합니다. 보조 노트로 : 당신은 체이스의 의견에 확장 할 수 있습니다와 같은 :

colorlist 색상 또는 colornames이든의 벡터이며, 당신이 당신의 필요에 맞는 알고리즘을 선택
plot(x,y,t='p', col=colorlist[some_function_of_x]) 

.Andrie의 플롯의 첫 번째는

xyplot(y~x, data=df, panel=function(x,y,subscripts, groups, ...) { 
    for(k in seq_len(length(subscripts)-1)) { 
    i <- subscripts[k] 
    j <- subscripts[k+1] 
    panel.segments(df$x[i], df$y[i], df$x[j], df$y[j], col=df$col[i]) 
    } 
}) 

불행하게도 나는의 매끄러운 방법을 알고하지 않습니다 ...
colorlist=c('red','black')
및 @joran 및 기타 격자 팬들을위한 plot(x,y,t='p', col=colorlist[1+(abs(x-55)<=5)])

4


와 함께 할 수 그렇게하면 기본 솔루션을 기본적으로 패널 함수로 래핑합니다. 위의 작품 올바르게로 여기 a 변수, 예를 들어, y~x|a를 들어, 그룹으로 분할하는 |를 사용하는 경우 :

xyplot(y~x, group=a, data=df, panel=function(x,y,subscripts, groups, ...) { 
    if(missing(groups)) { groups <- rep(1, length(subscripts)) } 
    grps <- split(subscripts, groups) 
    for(grp in grps) { 
    for(k in seq_len(length(grp)-1)) { 
     i <- grp[k] 
     j <- grp[k+1] 
     panel.segments(df$x[i], df$y[i], df$x[j], df$y[j], col=df$col[i]) 
    } 
    } 
}) 
:

df <- data.frame(
    x = 1:100, 
    y = rnorm(100,1,100), 
    col = c(rep("red", 50), rep("black", 10), rep("red", 40)), 
    a = 1:2 
) 

을뿐만 아니라 group=를 사용하려면 다음이 필요 했어

2

한 - 라이너를 사용하여 단지 기본 라이브러리 :

segments(head(x, -1), head(y, -1), x[-1], y[-1], rep(c("red", "black", "red"), c(49, 10, 40))) 

(Andrie's usage of segments에서 영감을 HIST 참조 포스트 거기 토론) 흥미롭게도

, 그것은이 단축 될 수있다 :

segments(head(x, -1), head(y, -1), x[-1], y[-1], rep(c("red", "black"), c(49, 10))) 
관련 문제