减少两个并排geom_violins的宽度,同时保持各个小提琴的大小

时间:2017-04-20 19:51:20

标签: r ggplot2 r-grid

我试图生成两个并排的geom_violin图并缩小左边 和右边界,以及主要类别之间的中间分隔线 两个图的x轴。这是一个简单的例子来说明我想要实现的目标:

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并且只减小绘图的总宽度(不影响小提琴的大小)。此外,请注意rel_widths函数的plot_grid无效,因为我需要两个图的宽度相同。

我搜索了一个类似的问题并找到this one;但是,答案使用“打印”声明,仅适用于一个情节。任何人都可以为我的案例概括一下这个答案吗?

为了重复我的示例,我还列出了我的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    

修改 我自己就找到了答案。可以通过向ggplots添加+ scale_x_discrete(expand = c(0,0))来删除边界间距。内部间距由宽度参数控制。

2 个答案:

答案 0 :(得分: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

答案 1 :(得分:0)

如果您希望保持代码大致完整,只需将position = position_dodge(width = 0.7)作为参数添加到geom_violin即可。根据需要更改宽度编号。