2013-08-21 2 views
4

데이터 세트의 열을 기반으로 ggplot2 범례 가이드의 aes 크기 값을 어떻게 무시합니까?ggplot2의 라인 크기에 맞게 색상 표 범례 가이드 수정

예를 참조

library(data.table) 
set.seed(26798) 

dt<-rbind(data.table(Trial="A",Value=rweibull(1000,1.0,0.5)), 
     data.table(Trial="B",Value=rweibull(100,1.2,0.75)), 
     data.table(Trial="C",Value=rweibull(10,1.3,0.8))) 

# Add a count and something like a cumulative distribution: 
dt2<-dt[order(Trial,Value),list(Value,N=.N),by=Trial][,list(Value,N,y=1-cumsum(N)/sum(N)),by=Trial] 
dt2 
##  Trial  Value N  y 
## 1:  A 0.0003628745 1000 0.999 
## 2:  A 0.0013002615 1000 0.998 
## 3:  A 0.0017002173 1000 0.997 
## 4:  A 0.0022597343 1000 0.996 
## 5:  A 0.0026608082 1000 0.995 
## ---        
##1096:  B 1.6821827814 100 0.040 
##1097:  B 2.2431595707 100 0.030 
##1098:  B 2.5122479833 100 0.020 
##1099:  B 2.5519954416 100 0.010 
##1100:  B 2.6848412995 100 0.000 

ggplot(dt2) + 
    geom_line(aes(x=Value,y=y,group=Trial,color=Trial,size=N)) + 
    scale_size(range=c(0.1, 2), trans="log") + 
    guides(size=F, color=guide_legend(override.aes=list(size=2))) 

Plot of three trials

제가 각각에 대한 선 두께를 원하는 (편집 2는 : 시험 C를 첨가하고, 로그 스케일을 사용하여 라인 크기를 변경) ("A"는 두껍고 "B"는 얇아 야 함)와 일치하도록 가이드 범례의 Trial 값. 편집 1 : @Arun과 @ChelseaE는 수동으로 각 두께를 조정할 수있는 좋은 제안을 주었지만 실제 데이터 세트는 많은 요소 수준을 가지며 끊임없이 변화하므로 "동적"이어야합니다.

@DidzisElferts에서 비슷한 질문 (Control ggplot2 legend look without affecting the plot)으로 대답하면 크기를 정적 값으로 설정하는 방법이 나와 있습니다. 위 예제의 마지막 줄에있는 size=2 부분을 사용하면 범례의 선 크기를 변경할 수 있지만 플롯에서 선의 크기와 일치 시키길 원합니다. 대신 size=N을 사용하면 논리적 인 것처럼 보이지만 "object 'N'not found"오류가 발생합니다. 올바른 구문은 무엇입니까?

원하는 출력 :

Plot of three trials with desired legend

+1

이해가 안됩니다. 회선 크기를 평가판과 일치 시키려면, 왜 N에 매핑합니까? – baptiste

+0

글쎄, 내 구현에서 뭔가 올바르게하고있는 게 아니 겠지만 줄거리의 의도는 선의 두께를 사용하여 각 시험의 관측 수가 다르다는 것을 보여주는 것이다. 그럼 전설이 그 음모와 일치하길 바래요. 나의 실제 데이터는 두 개가 아닌 5-10 라인을 가지고 있으며, 범례가 일치 할 때 플롯의 라인을 찾아내는 것이 시각적으로 도움이됩니다. – dnlbrky

답변

7

당신은 당신이 단지 1 크기를 설정 한 B. 모두에 따라 크기를 설정해야합니다. 이 시도 :

p <- ggplot(dt2) + 
geom_line(aes(x=Value,y=y,group=Trial,color=Trial,size=N)) + 
scale_size(range=c(0.1, 2)) + 
guides(size=FALSE, color=guide_legend(override.aes=list(size=c(2, .1)))) 

영업 이익의 의견에 따라 :

좋아,이 경우에, 당신은 (이 어쩌면 쉬운 방법 일 좀 더해야 할 것이다, 나는 생각할 수 없다 그것들은, 현재 있다면).

scales <- c(0.1, 2) # the range you want: min, max 
vals <- summary(lm(scales ~ c(min(dt2$N), max(dt2$N))))$coefficients[,1] 
sizes <- vals[2] * unique(dt2$N) + vals[1] 

ggplot(dt2) + 
geom_line(aes(x=Value,y=y,group=Trial,color=Trial,size=N)) + 
scale_size(range=scales) + 
guides(size=FALSE, color=guide_legend(override.aes=list(size=sizes))) 

이렇게하면됩니다. 시도해보고 문제가 있으면 알려주십시오.

+0

좋은 제안에 감사드립니다, @Arun. 그러나 실제 데이터 세트에는 끊임없이 변화하는 많은 가치가 있으므로 더욱 역동적 인 것이 필요합니다.이를 반영하기 위해 질문을 업데이트했습니다. – dnlbrky

+0

@dnlbrky, 일반 시나리오에 적합한 지 확인하기 위해 편집을 점검하십시오. 네가 곤란하다면 알려줘. – Arun

+0

감사합니다.이 경로가 작동합니다. 환경 설정에 따라 나는이 수정을 사용할 것이다 : 'size = rescale (dt2 [, (시험판), 순서 (시험판), 로그 (N)], 비늘)''목록. – dnlbrky

1

guide_legend 내부의 크기 범위를 추가보십시오 :

ggplot(dt2) + geom_line(aes(x = Value, y = y, group = Trial, color = Trial, size = N)) + scale_size(range = c(0.1, 2)) + guides(size = F, color = guide_legend(override.aes = list(size = range(0.1,2))))

편집이 : (확실하지 작동 할 수 있음) 다음

또한 N의 벡터 (N <- dt2$N)를 만드는 시도 할 수 및 사용 size = N

희망이 도움이됩니다.