2017-04-20 8 views
0

2つのside-by-side geom_violinプロットを生成し、左の と右の境界線を縮小しようとしています。両方のプロットのx軸の の主要カテゴリ。ここで私が達成しようとしているものを説明するための最小限の例です。個々のバイオリンのサイズを維持しながら、2つのサイドバイサイドgeom_violinsの幅を小さくする

require(dplyr) 
require(ggplot2) 
require(grid) 
require(gridExtra) 
require(cowplot) 

# two major categories (cut) and five 
# subcategories (color) are enough for the purpose of this question 
pi <- filter(diamonds, (cut=="Premium" | cut=="Ideal") & color<"I") 
pi$cut <- factor(pi$cut) 
pi$color <- factor(pi$color) 

th1 <- theme_bw() + theme(legend.position = "none") 

g1 <- ggplot(data=pi, aes(x=cut, fill=color, y=price)) + 
    geom_violin(width=0.5) + th1 

g2 <- ggplot(data=pi, aes(x=cut, fill=color, y=depth)) + 
    geom_violin(width=0.5) + th1 


grid.newpage() 
grid.arrange(plot_grid(g1,g2, ncol = 2, rel_widths = c(0.3,0.3))) 

このコードは、次のようなものを作成します。 enter image description here

私はトリミングまたは削減したいスペースをマークしています。 geom_violin()のwidthパラメータを増やすと、実際にはこの間隔が減少することにご注意ください。 しかし、私はバイオリンの幅を0.5に保ち、(バイオリンのサイズに影響を与えずに)プロットの全幅を減らすだけです。また、私は両方のプロットを同じ幅にする必要があるので、は、役に立たないことに注意してください。plot_grid関数のrel_widthsは役に立ちません。

同様の質問を検索したところ、this oneが見つかりました。ただし、答えは "print"ステートメントを使用し、1つのプロットのみに適用されます。誰も私のケースのためにその答えを一般化してくださいできますか?私の例の再現性については

、私も自分のsessionInfo()をリストアップしています:

R version 3.3.2 (2016-10-31) 
Platform: x86_64-apple-darwin13.4.0 (64-bit) 
Running under: OS X Yosemite 10.10.5 

locale: 
[1] en_US.UTF-8/en_US.UTF-8/en_US.UTF-8/C/en_US.UTF-8/en_US.UTF-8 

attached base packages: 
[1] grid  stats  graphics grDevices utils  datasets methods base  

other attached packages: 
[1] cowplot_0.7.0 gridExtra_2.2.1 ggplot2_2.2.1 tidyr_0.6.1  dplyr_0.5.0  

loaded via a namespace (and not attached): 
[1] Rcpp_0.12.10  assertthat_0.1 R6_2.2.0   plyr_1.8.4  gtable_0.2.0  
[6] DBI_0.6-1  magrittr_1.5  scales_0.4.1  lazyeval_0.2.0 labeling_0.3  
[11] tools_3.3.2  munsell_0.4.3 colorspace_1.3-2 tibble_1.3.0  

EDIT 私は答えを自分自身を発見しました。境界スペーシングは、ggplotsに+ scale_x_discrete(expand = c(0,0))を追加することで削除できます。内側の間隔はwidthパラメータで制御します。

答えて

0

これは私がgrid.arrange

library(dplyr) 
library(tidyr) 
library(ggplot2) 

th1 <- theme_bw() + theme(legend.position = "none") 

pi %>% 
    mutate(log_price = log10(price)) %>% 
    gather(Attribute, Value, log_price, depth) %>% 
    ggplot(aes(x = cut, y = Value, fill = color)) + 
    geom_violin(width = 0.7) + 
    th1 + 
    facet_wrap(~ Attribute, scales = "free_y") 

、あなたのコードを維持したい場合は、自動的に約0.85

+0

非常に良好です。しかし、あなたの答えには2つの問題があります。(1)異なるカットカテゴリ間の中央の区切りがほとんど削除されます(削除しないでください)。(2)左のプロットを対数スケールで、右を線形にする必要がある場合スケール(と私はこれを確かに必要とする)、私はあなたの答えを使用してこれを行うにはどうすればいいですか?だから私はgrid.arrangeを使いました。とにかく、私はあなたの答えから多くを学んだので、答えをアップアップしました。ありがとう。 – user8420488483439

+0

あなたの答えに 'geom_violin()'の代わりに 'geom_violin(width = 0.5)'を使うと、あなたのプロットの形は私の疑問のプロットに頼ります。 – user8420488483439

+0

1)そこに 'geom_violin(width = 0.7)+'などをポップすることができます。あなたが一番好きなものを見つけるために遊んでください。 2)ログトランスモレレーションの回答を更新します – Zafar

0

に幅を設定しますように見えるような不格好な他の機能の代わりに、ファセッティング使用も、私の作品ほとんど損なわれていない場合は、geom_violinにパラメータとしてposition = position_dodge(width = 0.7)を追加してください。あなたが望むように幅番号を変更してください。

関連する問題