搜索一轮,发现可以使用 ggforce::facet_row() 函数可以解决。以下用 diamonds 数据集展示一下。
ggforce::facet_row()
diamonds
12345
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 进行分面。 123456789df1 <- 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大小。 12345rbind(df1, df2, df3) %>% ggplot(aes(x=cut, y=price, fill=cut)) + geom_boxplot() + facet_row(~color, scales = "free_x", space = "free") + theme_bw() Refhttps://stackoverflow.com/questions/52341385/how-to-automatically-adjust-the-width-of-each-facet-for-facet-wrap
## 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 进行分面。 123456789df1 <- 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大小。 12345rbind(df1, df2, df3) %>% ggplot(aes(x=cut, y=price, fill=cut)) + geom_boxplot() + facet_row(~color, scales = "free_x", space = "free") + theme_bw()
我们手动挑选各个 color 中的个别 cut 数据出来。使用 facet_grid 进行分面。
color
cut
facet_grid
123456789
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()
Refhttps://stackoverflow.com/questions/52341385/how-to-automatically-adjust-the-width-of-each-facet-for-facet-wrap