一、cowplot包
cowplot是一个R包,提供了一组可用于绘制复杂绘图布局的工具。它的主要目标是简化多个ggplot2图形的排版,并提供了额外的标注和注释功能。cowplot使得组合和渲染高质量的多图组件成为可能,同时使得不同现有图形之间库存游移和调整更加容易。引入cowplot包可以使得绘图的复杂程度得到显著降低,从而提高开发效率。
二、cowplot如何添加公共图例
在多图拼接中,添加公共的图例非常重要。cowplot提供了方便且可定制化的方法来添加公共图例。您需要调用cowplot包的plot_grid()函数并将您要组合的绘图放入组合中。由于ggplot2返回图形对象,因此您可以将两个或更多对象指定给plot_grid()。下面是一个简单的示例,演示如何将两个绘制的ggplot2图形组合并添加一个公共图例。
library(cowplot)
library(ggplot2)
# Plot1
plot1 <- ggplot(mtcars, aes(x = wt, y = hp, col = factor(cyl))) +
geom_point() +
theme_classic()
# Plot2
plot2 <- ggplot(mtcars, aes(x = wt, y = disp, col = factor(cyl))) +
geom_point() +
theme_classic()
# Add legend to the bottom of the combined plot
combined <- plot_grid(plot1, plot2, nrow = 1, align = "h",
labels = c("A", "B"), label_size = 26)
combined_legend <- get_legend(plot1) # Get legend from plot1
combined <- plot_grid(combined, combined_legend, nrow = 2, rel_heights = c(1, 0.05))
combined
在这个例子中,我们定义了两个绘图:plot1和plot2。然后我们将它们组装成一个组合,然后通过get_legend()函数从plot1中提取图例。最后,我们将合并后的图形和图例再次组合在一起,使它们占据整个布局的两个部分。定义的公共图例会显示在底部,标注合并后的图形中线条的含义,使之更加易于理解。
三、cowplot拼图
在这个例子中,我们建立了一个简单的横向拼接的示例,用于演示cowplot中的plot_grid()函数。plot_grid()函数在cowplot中是拼贴图的骨架函数。它用于将相同大小的ggplot2对象整合到一起。通过使用将注释信息添加到图其中的annotate()函数和ggdraw()函数,可以对拼图进行更密集的自定义。
library(cowplot)
library(ggplot2)
# plot 1 : scatterplot
plot1 <- ggplot(mpg, aes(x = displ, y = hwy, col = class)) +
geom_point() +
theme_classic() +
ggtitle("Scatter Plot")
# plot 2 : bar chart
plot2 <- ggplot(mpg, aes(x=class, y=hwy, fill=class)) +
geom_bar(stat="identity") +
theme_classic() +
ggtitle("Bar Chart")
# plot 3 : histogram
plot3 <- ggplot(mpg, aes(x=hwy)) +
geom_histogram(binwidth = 2, fill='blue', col='white') +
theme_classic()+
ggtitle("Histogram")
# arrange the plots in one view
myplots <- plot_grid(plot1, plot2, plot3, labels=c('A', 'B', 'C'), align='h', ncol=3)
# add metadata to the plot
ggdraw() +
draw_label("My different types of plots!", fontface = 'bold', size = 20,
x = 0, y = 0.9, hjust = 0, vjust = 1) +
draw_label("This is my footnote.", fontface = 'bold', size = 10,
x = 0, y = 0.05, hjust = 0, vjust = 1) +
plot_grid(myplots, labels = c('A', 'B', 'C'), align = 'h', ncol = 3, rel_heights = rep(1, 4),
axis = 'tblr')
在这个示例中,我们定义了三个ggplot对象,并使用plot_grid()函数将它们放在一起。接着,在ggdraw()函数内置元素并将它们添加到拼贴图中。其中,我们添加并定制了主标题和页脚。对于拼贴图的基本初始布局和组装,可以使用plot_grid()函数,并在需要时使用其他cowplot函数,如annotate()和ggdraw()实现自定义注释。
四、cowplot公共图例
我们能轻松将一个放在多个图案,但最难的是将它们放在一起,使它们共用相同的标度,方向、系列标签等。cowplot提供了一种方法,使得向单个图案中添加公共图例变得简单。下面是一个例子演示如何将一个公共图例添加到多个ggplot2对象上。
library(cowplot)
library(ggplot2)
# Plot1
Plot1 <- ggplot(mtcars, aes(x = wt, y = hp, col = factor(cyl))) +
geom_point() +
theme_classic() +
ggtitle("Scatter Plot1")
# Plot2
Plot2 <- ggplot(mtcars, aes(x = wt, y = disp, col = factor(cyl))) +
geom_point() +
theme_classic() +
ggtitle("Scatter Plot2")
p_list <- list(Plot1, Plot2)
n <- length(p_list)
# Adding shared legend (to the bottom) and arranging the plot grids
my_legend %
cowplot::add_sub(" ") %>%
cowplot::add_sub("", " ")
}
my_legend <- cowplot::plot_grid(my_legend, ncol = n, align = "h")
p_list <- lapply(seq_along(p_list), function(x) {
cowplot::plot_spacer() + p_list[[x]] +
theme(legend.position = "none") +
theme(plot.margin = unit(c(0, 0, 0.5, 0), "cm")) +
annotation_custom(grid::grobs::grobTree(my_legend),
xmin = -Inf,
xmax = Inf,
ymin = -Inf,
ymax = Inf,
respect = TRUE,
default.units = "native")
})
combined <- cowplot::plot_grid(plotlist = p_list, ncol = 1, align = "h")
combined
在这个例子中,我们定义了两个绘图:Plot1和Plot2。然后,我们将它们放在一个共同的图例下面。通过循环方法使用add_sub()增加很多优化步骤,使字母竖直对齐。然后我们使用plot_spacer()空白图形将每张图形包装起来,并使用annotation_custom()将公共图例添加到每张图形中。最后,我们运用plot_grid()函数,将每个已标注并包含了公共图例的图形拼接成一个唯一的对象。
五、cowplot与ggpubr
ggpubr是一个R包,提供了一组宏和函数,使得您可以轻松制作热力图、箱线图、散点图等。主要优势是可以快速方便地插入统计检验效果图,同时也支持对ggplot2绘图的扩展和注解。Gpubr可以很好地与cowplot包结合使用,使用cowplot包的功能优化样式和组合单个发布级别的视图。
# demo data
df <- iris[c(1:5, 51:55, 101:105), ]
# scatterplot matrix with diagonal density plots and correlogram
p <- ggpairs(df, columns = 1:4, ggplot2::aes(color = Species),
diag = list(continuous = wrap('density', alpha = 0.5)),
upper = list(continuous = wrap('points')),
lower = list(continuous = wrap('smooth'))) +
theme_classic() +
theme(legend.position = "bottom")
# Statistical tests
p <- ggpubr::add_y_significance(p, "Sepal.Length", "Sepal.Width", tip_length = 0.01)
# Adjust plot margin
p <- ggplot2::ggplot2::theme(plot.margin = ggplot2::unit(rep(0.1,5), "cm")) + p
# Final plot with cowplot
p <- cowplot::ggdraw() +
cowplot::draw_label("iris dataset scatterplot matrix", fontface = 'bold', size = 20,
x = 0, y = 0.9, hjust = 0, vjust = 1) +
cowplot::ggdraw::draw_label("- Animal 1: Black
- Animal 2: Grey
- Animal 3: Green ",
size = 10, hjust = 0, vjust = 0, fontcolour = 'grey20') +
cowplot::plot_grid(p, labels = c("", ""))
在这个例子中,我们从鸢尾花数据集创建了一个散点图矩阵,然后运用ggpubr包从中提取一些重要的统计检验,并将这些检验嵌入到散点图之中。然后,我们通过运用cowplot包的ggdraw()函数,定制化添加了一些标注,并使用plot_grid()函数将拼图组合成一张发布级别的可视化。
六、cowplot提取轴标签
在提取或更改轴标签等元素时,使用cowplot包提供的功能,可以轻松地进行自定义。cowplot包中的get_y_axis_label()和get_x_axis_label()函数可以用于提取轴标签。
library(ggplot2)
library(cowplot)
# data
df <- diamonds[diamonds$carat < 2, ]
head(df)
# plot 1
p1 <- ggplot(df, aes(carat, price, col = cut)) +
geom_point() +
theme_bw() +
xlab("Carat") +
ylab("Price")
# plot 2 with the rotated y-axis label
p2 <- ggplot(df, aes(carat, price, col = cut)) +
geom_point() +
theme_bw() +
xlab("Carat") +
ylab("Price") +
cowplot::theme(axis.title.y = element_text(angle = 0, vjust = 1))
# Extract y-axis labels from p1 and p2
label_p1 <- cowplot::get_y_axis_label(p1)
label_p2 <- cowplot::get_y_axis_label(p2)
# Invert y-axis label of p2 and check with label of p1
p2_inverted <- p2 + cowplot::theme(axis.title.y = element_text(angle = 180, vjust = 0))
label_p2_inv <- cowplot::get_y_axis_label(p2_inverted)
label_p1
# Output: "Price"
label_p2
# Output: "Price"
label_p2_inv
# Output: "ecirP"
在这个例子中,我们定义了两个ggplot散点图,并使用theme()函数的axis.title.y参数实现将y轴标签旋转180度。迭代调用get_y_axis_label()函数从两个图形中提取y轴标签。然后,我们通过使用另一个theme()函数的axis.title.y参数将y轴标签反转,这通过调用get_y_axis_label()函数时输出反向标签作为输出结果,证明所做的
原创文章,作者:小蓝,如若转载,请注明出处:https://www.506064.com/n/236675.html