Я пытаюсь создать два расположенных рядом графика 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)))
Этот код создаст что-то вроде следующего:
Я отметил пробелы, которые я хотел бы обрезать или уменьшить. Обратите внимание: я знаю, что увеличение параметра ширины в функции geom_violin() действительно уменьшит это расстояние; однако я хочу сохранить ширину скрипок на уровне 0,5 и уменьшить только общую ширину графика (не затрагивая размеры скрипок). Также обратите внимание, что rel_widths
функции plot_grid
не помогает, так как мне нужно, чтобы оба графика были одинаковой ширины.
Я искал аналогичный вопрос и нашел этот; однако в ответе используется оператор «печать» и он предназначен только для одного графика. Может ли кто-нибудь обобщить этот ответ и для моего случая?
Для воспроизводимости моего примера я также перечисляю свои 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 Я только что сам нашел ответ. Расстояние между границами можно убрать, добавив + scale_x_discrete(expand = c(0,0))
к ggplots. Внутренний интервал контролируется параметром ширины.