今天遇到一个复杂的画图任务
先看最终效果图
其实这是左右两张ggplot合并的结果。注意两张图有两个共有水平(红色,蓝色),但每个图不完全包含全部四个水平。最后legend出要有全部4个水平。
如果使用简单的facet_grid,结果如下
每张图会余留一个空缺位置,达不到想要的效果。核心思路是画两个ggplot,再用ggarrange合并。需要注意的是,本人很久没用R了,不知道是ggplot2更新了思路了还是咋的,用p<- ggplot(…) + geom_box(…)一直不能成功,只有用ggboxplot(…)才能成功。下面介绍具体方法
第一步获取公共legend
在这一步就简单把所有水平都一起画个图,然后调整legend到自己想要的样子,之后ggarrange会直接把legend部分抠图粘贴上去。
library(ggpubr)
dat_cp_1 =fread('icmodel_2022-11-02method(25)N50_1d.csv')
dat_cp_2 =fread('icmodel_2022-11-02method(23)N50_1d.csv')
dat_cp_1$init <- factor(dat_cp_1$init, levels = c('best_model', 'true_change_points','random_cp_K2'),
labels = c('Best Model', 'Oracle Change Point', 'Random Change Point'))
dat_cp_2$init <- factor(dat_cp_2$init, levels = c('best_model', 'true_change_points','no_change_points'),
labels = c('Best Model', 'Oracle Change Point', 'No Change Point'))
dat_cp = rbind(dat_cp_1, dat_cp_2)
dat_cp$Setting <- factor(dat_cp$Setting,levels = c('pwconst2', 'smooth'),
labels = c('Piecewise Constant', 'Smooth'))
dat_cp$compare = rep(c('setting1', 'setting2'), each = dim(dat_cp_1)[1])
dat_cp_processed <- gather(dat_cp, metric, value, -c('Setting', 'seed', 'init','compare'))
dat_cp_processed$metric=factor(dat_cp_processed$metric, levels = c('cp_err', 'ARI'),
labels = c('CP Error', 'ARI'))
cbPalette=c('#cc0c00', '#5c88da','#84bd00', '#ffcc00', '#7c878e','#00b5e2','#00af66',"#E69F00","#660099")
p2 &