2015-01-06 2 views
0

좌표이해 내가 간단한 barplot에서 시작하고 geom_path``의 인자와 유사한 기능

df <- data.frame(xpos=c(200,300,400), 
       ypos=c( 1, 3, 2)) 
gp <- ggplot(df, aes(x=xpos, y=ypos)) + 
    geom_bar(stat="identity") 

을 다음 사용자 지정 여러 줄이 점의 좌표를 주어진 추가 할 (의 이러한 좌표가 완전히 사용자 정의 말할하자 바 플롯 데이터와 관련 없음).

gp + geom_path(mapping=aes(x=c(200, 200, 300), 
          y=c(1.5, 2, 2)), 
       size=1.2) 

(여기에 질문 data 대에 대한 mapping했지만 지금은 다윗의 의견 덕분에 그것을 가지고 내가 혼란에 대한 유감 별도로 두 가지 질문을 넣어 오히려이 있어야합니다.) : 그것은 3 점으로 잘 작동 나는 하나 또는 두 개의 점을 더 추가하려고하면

그런 다음이 더 이상 작동하지 않습니다

gp + geom_path(mapping=aes(x=c(200, 200, 300, 300), 
          y=c(1.5, 2, 2, 1)), 
       size=1.2) 
# Error in data.frame(x = c(200, 200, 300, 300), y = c(1.5, 2, 2, 1), PANEL = c(1L, : 
# arguments imply differing number of rows: 4, 3 

이 왜 3에 내 데이터를 잘라합니까? 확인을 다시 6 5 점과 동일하지만, :

gp + geom_path(mapping=aes(x=c(200, 200, 300, 300, 100, 150), 
          y=c(1.5, 2, 2, 1, 1.5, 1.8)), 
       size=1.2) 

나는 geom_path 단순히 모든 좌표를 연결하는 생각, 그래서 우리는 xy 인수의 동일한 번호를 제공해야합니다. 왜 내 경우에는 3의 그룹에서만 작동합니까?

답변

2

문제는 사용자가 3 행 데이터 프레임을 '최상위 레벨'에 넣었다는 것입니다. ggplot입니다. geom_path 데이터의 포인트 수가 데이터 프레임의 행 수의 배수가 아닌 경우 (예 : 4 대 3) 오류가 발생합니다. 이는 어떤 지점에서 ggplot이 하나의 데이터 프레임에 데이터를 결합하려고 시도하기 때문입니다.

한 가지 가능한 해결 방법 ggplotgeom_bar에에서 geom_bar에 대한 데이터를 이동하는 것입니다 : 플롯을 렌더링하는 데 사용되는 데이터를 보면

gp <- ggplot() + 
    geom_bar(data = df, aes(x = xpos, y = ypos), stat = "identity") + 
    geom_path(mapping = aes(x = c(200, 200, 300, 300), 
          y = c(1.5, 2, 2, 1)))    
gp 

, 당신은 별도의 두 것을 볼 데이터 프레임 : 첫 번째 시도를 사용할 때

str(ggplot_build(gp)$data) 
# List of 2 
# $ :'data.frame': 3 obs. of 8 variables: <~~ this is the data for the bars 
# ..$ x : num [1:3] 200 300 400 
# ..$ y : num [1:3] 1 3 2 
# ..$ PANEL: int [1:3] 1 1 1 
# ..$ group: int [1:3] 1 1 1 
# ..$ ymin : num [1:3] 0 0 0 
# ..$ ymax : num [1:3] 1 3 2 
# ..$ xmin : num [1:3] 155 255 355 
# ..$ xmax : num [1:3] 245 345 445 
# $ :'data.frame': 4 obs. of 4 variables: <~~ this is the data for the path 
# ..$ x : num [1:4] 200 200 300 300 
# ..$ y : num [1:4] 1.5 2 2 1 
# ..$ PANEL: num [1:4] 1 1 1 1 
# ..$ group: int [1:4] 1 1 1 1 

이 최상위 수준의 "DF"및 "DF"의 행 수의 배수가되는 geom_path에있는 점의 수와도의 경우 . 따라서 최상위 수준의 "df"를 사용하면 ggplot이 어느 시점에서 데이터를 하나의 데이터 프레임에 결합하려고 시도한 다음 각 계층에 대해 별도의 데이터 프레임을 사용하여 플롯을 렌더링합니다.

gp <- ggplot(df, aes(x = xpos, y = ypos)) + 
    geom_bar(stat = "identity") + 
    geom_path(mapping = aes(x = c(200, 200, 300, 300, 100, 150), 
          y = c(1.5, 2, 2, 1, 1.5, 1.8))) 
str(ggplot_build(gp)$data) 

여기에는 매우 일반적인 프레임 중심의 ggplot의 일반적인 특성이 강조되어 있습니다.

+0

설명해 주셔서 감사합니다. 또 다른 해결 방법은'data ='에 좌표를 넣는 것입니다. –

0

내 실수를 발견했습니다. data을 재정의하지 않고 mapping은 원본 데이터 프레임의 크기를 사용합니다. 그래서, 제 경우에는 명시 적으로 내 경로의 좌표를 data에 넣어야합니다.