2017-12-17 20 views
2

이 예제의 다음지도에 막대 그래프를 플로팅하려고합니다 : How to plot barchart onto ggplot2 map. 이것은 잘 작동하지만 예제와는 달리 x 축과 y 축을 추가하고 싶습니다. 문제는 데이터의 y 범위가 막대 그래프를 만들려는 지역에서 상당히 다르다는 것입니다.y 축이 서로 다르지만 y 한계가 서로 다른 두 개의 ggplot을 만듭니다.

비교 가능한 그래프 (즉, y 축의 치수가 동일한 경우)를 생성하기 위해 모든 그래프에 동일한 y 제한을 적용하고 각 그래프의 구분을 조정합니다. 그러나 그래프의 일부 (이 경우 p2)가 막대 위 및 아래에 큰 빈 영역을 가지고 있기 때문에 이는 좋은 해결책이 아닙니다. 그것을 작동하게하기 위해서, 그래프를 잘라내어 빈 영역을 없애는 동시에, y 축을 비교할 수 있도록 그래프의 크기를 유지하는 방법을 찾고 있습니다.

library(dplyr) 
library(ggplot2) 

df <- data.frame(type = c("A", "B", "A", "B"), country = c("NLD", "NLD", "BEL", "BEL"), value = c(10, -10, 5, 2)) 

df1 <- filter(df, country == "NLD") 
p1 <- ggplot(data = df1) + 
    geom_col(aes(x = type, y = value)) + 
    scale_y_continuous(limits = c(min(df$value), max(df$value)), breaks = seq(min(df1$value), max(df1$value), 2)) + 
    theme_bw() 
p1 


df2 <- filter(df, country == "BEL") 
p2 <- ggplot(data = df2) + 
     geom_col(aes(x = type, y = value)) + 
     scale_y_continuous(limits = c(min(df$value), max(df$value)), breaks = seq(min(df2$value), max(df2$value), 2)) + 
     theme_bw() 
    p2 

답변

1

각 플롯에 대해 coord_fixed을 사용해 보셨습니까? 각 플롯의 너비를 동일하게 조절할 수 있다면 막대의 높이를 비교할 수 있습니다.

library(dplyr) 
library(ggplot2) 
library(gridExtra) 

df <- data.frame(type = c("A", "B", "A", "B"), country = c("NLD", "NLD", "BEL", "BEL"), value = c(10, -10, 5, 2)) 

df1 <- filter(df, country == "NLD") 
p1 <- ggplot(data = df1) + 
    geom_col(aes(x = type, y = value)) + 
    # scale_y_continuous(limits = c(min(df$value), max(df$value)), breaks = seq(min(df1$value), max(df1$value), 2)) + 
    theme_bw() 

df2 <- filter(df, country == "BEL") 
p2 <- ggplot(data = df2) + 
    geom_col(aes(x = type, y = value)) + 
    # scale_y_continuous(limits = c(min(df$value), max(df$value)), breaks = seq(min(df2$value), max(df2$value), 2)) + 
    theme_bw() 

x_range <- length(unique(df$type)) 
y_range1 <- max(df1$value) - min(df1$value) 
y_range2 <- max(df2$value) - min(df2$value) 

g1 <- p1 + coord_fixed(ratio = x_range/y_range1) 
g2 <- p2 + coord_fixed(ratio = x_range/y_range1) 

# example output 
grid.arrange(g1, g2, nrow = 1) 
+0

이것은 내 문제를 90 % 해결하는 훌륭한 간단한 해결책입니다. 그러나 일부 플롯의 경우 x 축의 모든 범주에 대한 데이터가 없으므로이 솔루션은 이러한 수치의 크기가 왜곡됩니다. 보편적 인 솔루션을 제공하는 솔루션을 환영합니다. –

+0

이것이 원하는 것인지 확신 할 수 없지만 p1, p2, ...에 'scale_x_discrete (limits = levels (df $ type))'을 추가하여 모든 플롯이 동일한 'x 축'을 갖도록 강제 할 수 있습니다. 바 너비는 p1, p2, ...에 걸쳐 동일합니다. 유형이없는 경우 공백이 생깁니다. –