R-ggplot调整分面宽度

  • 问题描述
  • 解决方法

问题描述

最近用ggplot画分面图的时候碰到一个问题。在分面的各个x轴上变量数目不一样,导致画出来的每个分面中的图大小也不一样。

解决方法

搜索一轮,发现可以使用 ggforce::facet_row() 函数可以解决。以下用 diamonds 数据集展示一下。

library(ggplot2)
library(ggforce)
library(dplyr)

str(diamonds)
## tibble [53,940 x 10] (S3: tbl_df/tbl/data.frame)
##  $ carat  : num [1:53940] 0.23 0.21 0.23 0.29 0.31 0.24 0.24 0.26 0.22 0.23 ...
##  $ cut    : Ord.factor w/ 5 levels "Fair"<"Good"<..: 5 4 2 4 2 3 3 3 1 3 ...
##  $ color  : Ord.factor w/ 7 levels "D"<"E"<"F"<"G"<..: 2 2 2 6 7 7 6 5 2 5 ...
##  $ clarity: Ord.factor w/ 8 levels "I1"<"SI2"<"SI1"<..: 2 3 5 4 2 6 7 3 4 5 ...
##  $ depth  : num [1:53940] 61.5 59.8 56.9 62.4 63.3 62.8 62.3 61.9 65.1 59.4 ...
##  $ table  : num [1:53940] 55 61 65 58 58 57 57 55 61 61 ...
##  $ price  : int [1:53940] 326 326 327 334 335 336 336 337 337 338 ...
##  $ x      : num [1:53940] 3.95 3.89 4.05 4.2 4.34 3.94 3.95 4.07 3.87 4 ...
##  $ y      : num [1:53940] 3.98 3.84 4.07 4.23 4.35 3.96 3.98 4.11 3.78 4.05 ...
##  $ z      : num [1:53940] 2.43 2.31 2.31 2.63 2.75 2.48 2.47 2.53 2.49 2.39 ...

我们手动挑选各个 color 中的个别 cut 数据出来。使用 facet_grid 进行分面。

df1 <- subset(diamonds, color == "D" & cut != "Good")
df2 <- subset(diamonds, color == "E" & cut == "Ideal")
df3 <- subset(diamonds, color == "F")

rbind(df1, df2, df3) %>% 
  ggplot(aes(x=cut, y=price, fill=cut)) +
  geom_boxplot() +
  facet_grid(~color, scales = "free_x") +
  theme_bw()

可以发现不同分面中的box大小是不一样的。我们可以下面的代码自动调整各个分面的box大小。

rbind(df1, df2, df3) %>% 
  ggplot(aes(x=cut, y=price, fill=cut)) +
  geom_boxplot() +
  facet_row(~color, scales = "free_x", space = "free") +
  theme_bw()

Ref
https://stackoverflow.com/questions/52341385/how-to-automatically-adjust-the-width-of-each-facet-for-facet-wrap

完。

你可能感兴趣的:(R-ggplot调整分面宽度)