问题描述
最近用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()
完。
网友评论