2017-12-17 8 views
2

この例の次のマップに棒グラフをプロットしようとしています:How to plot barchart onto ggplot2 map。これは正常に動作しますが、例とは対照的にx軸とy軸を追加したいと思います。問題は、データのy範囲が、棒グラフを作成したい領域全体でかなり異なることです。類似のy軸を持ち、yの制限が異なる2つの別個のggplotsを作成します。

比較可能なグラフ(つまり、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、...で同じになります。タイプがない場合は空白があります。 –

関連する問題