2012-12-21 10 views
3

평소 그리는 대부분의 데이터 요소가 있지만 다른 크기의 심볼이있는 데이터 요소가있는 한 세트의 플롯을 작성하려고합니다. 나는 전설이 같은 것을 보여주기를 바란다 : 대부분의 포인트는 정상적으로 보여 지지만 예외는 다른 크기의 심볼로 그려진다.ggplot2 : 범례의 기호를 플롯의 기호와 일치 시키십시오.

library(ggplot2) 
x = c(1,2,1,2,3) 
y = c(1,2,3,4,3) 
vendor = c("x", "x", "y", "y", "z") 
df = data.frame(x,y,vendor) 

p <- ggplot(df) + 
    aes_string(x="x", y="y", color="vendor") + 
    geom_point(size=3, data=subset(df, vendor!="z")) + 
    geom_point(size=5, data=subset(df, vendor=="z")) 
ggsave("foo.pdf") 

문제는 생성 된 범례, 모든 포인트 만이 아닌 업체 (Z)과, 큰 (size=5) 기호가 그려이다 : 여기 짧은 코드 비트이다. 전설에서 더 큰 포인트로 그려진 벤더 z와 다른 사람들은 size=3으로 그려야합니다.

(보너스 질문 : 원형이 아니라 도넛이 더 큰 두꺼운 윤곽선 기호를 원합니다. 도넛을 원합니다. shape=2은 윤곽선이 그어진 원을 그리지 만 매우 얇습니다. . 두꺼운 설명 원이 나는 삼각형으로 동일한 작업을 수행하려면이 작업을 수행하는 모든 쉬운 방법을)

어쩌면 나는이 충고 다음 잘못 적용하지만, :.?

ggplot2: Making changes to symbols in the legend

가 추가 "가이드"라인의 도움이되지 않았다 :

guides(size = guide_legend(override.aes = list(shape = 1))) 

즉, 범례에있는 모든 공급 업체에 대해 size=5 기호가있는 동일한 출력.

EDITED : 나는 신속하게 구현 한 환상적인 답변입니다. 지금 추가 한 라인 :

library(ggplot2) 
x = c(1,2,1,2,3) 
y = c(1,2,3,4,3) 
vendor = c("x", "x", "y", "y", "z") 
df = data.frame(x,y,vendor) 

df$vendor_z <- df$vendor=="z"  # create a new column 

ggplot(df) + 
    aes_string(x = "x", y = "y", color = "vendor", size = "vendor_z") + 
    geom_point() + 
    geom_line(size=1.5) + # this is the only difference 
    scale_size_manual(values = c(3, 5), guide = FALSE) 
    guides(colour = guide_legend(override.aes = list(size = c(3, 3, 5)))) 

ggsave("foo.pdf") 

지금은 전설의 크기는 다시 아래 3 다시 공급 업체 z를 사람을 포함한 모든 점에 대한 것입니다. 이 문제를 해결하는 방법에 대한 아이디어가 있습니까?

+0

가 BTW 내가이야 : ​​당신은 인수 show_guide = FALSEgeom_line에 대한 전설을 억제 할 수있는 라인

추가 총 R n00b 그래서 내 코드를 비판하고 도와 줄 자유롭게 더 나아! – jowens

답변

4

sizeaes_string 밖에 없기 때문에 크기가 범례에 적용되지 않습니다. 더구나 의 작업은 vendor == "z"인지 여부를 나타내는 추가 열을 만드는 것이 훨씬 쉽습니다.

여기 파트 1에 대한 해결책 : vendor_zaes_string의 인수로입니다

df$vendor_z <- df$vendor=="z"  # create a new column 

ggplot(df) + 
    aes_string(x = "x", y = "y", color = "vendor", size = "vendor_z") + 
    geom_point() + 
    scale_size_manual(values = c(3, 5), guide = FALSE) + 
    guides(colour = guide_legend(override.aes = list(size = c(3, 3, 5)))) 

하는 것으로. 그러면 size 특성에 대한 범례를 만들려면 ggplot이 표시됩니다. 함수 scale_size_manual에서 size의 값이 설정됩니다. 또한 guide = FALSEsize에 대해서만 두 번째 범례를 사용하지 않습니다. 마지막으로 size 값이 color 범례에 적용됩니다.

enter image description here

2 부 :는 "도넛"기호는

원의 라인의 크기 ggplot에서 수정할 수 없습니다. 여기

ggplot(df) + 
    aes_string(x = "x", y = "y", color = "vendor", size = "vendor_z") + 
    geom_point() + 
    geom_point(data = df[df$vendor_z, ], aes(x = x, y = y), 
      size = 3, shape = 21, fill = "white", show_guide = FALSE) + 
    scale_size_manual(values = c(3, 5), guide = FALSE) + 
    guides(colour = guide_legend(override.aes = list(size = c(3, 3, 5)))) 

단일 지점 geom_point를 사용하여 그려진 데이터의 서브 세트 (df[df$vendor_z, ]) 여기서 해결된다.3size을 선택했습니다. 더 작은 원의 값이기 때문입니다. shape21fill 색을 지정할 수있는 원입니다. 마지막으로 show_guide = FALSE은 범례 특성이 새 shape으로 덮어 쓰여지지 않도록합니다.

enter image description here

편집 : 부분 3 :

ggplot(df) + 
    aes_string(x = "x", y = "y", color = "vendor", size = "vendor_z") + 
    geom_point() + 
    geom_line(size=1.5, show_guide = FALSE) + # this is the only difference 
    scale_size_manual(values = c(3, 5), guide = FALSE) + 
    guides(colour = guide_legend(override.aes = list(size = c(3, 3, 5)))) 

enter image description here

+0

감사합니다. Sven! 참으로 위대한 대답입니다. geom_line을 사용하여이 작업을 수행하는 방법을 묻는 질문에 조금 추가했습니다. – jowens

+0

그리고 도넛에 ... 도넛을 만드는 어떤 방법도 전설에 나타납니다? 좋은 해킹, 파란색 원의 꼭대기에 흰색을 그립니다. – jowens

+0

@ jowens 줄을 포함하는 솔루션으로 답변을 확장합니다. 전설에서 3 개의 기호 중 하나에 대해 파란색 원 위에 흰색을 그리는 것은 어려울 것이며 ggplot 외부의 해킹을 포함 할 수 있습니다. 제가 답을 찾으면 알려 드리겠습니다. –

관련 문제