ggplot图例位置非默认时,cowplot get_legend()提取图例失败
解决cowplot提取图例后grid.draw绘制空白图的问题
问题描述
使用cowplot包提取ggplot图表的图例,调用grid包的grid.draw()绘制时仅生成空白图,相关代码如下:
library(cowplot); library(patchwork); library(grid); library(tidyverse) # 创建图例数据 legend_data <- data.frame( julian = 299:366, PM25 = c(3.4,1.3,1.2,1.2,0.4,3.4,1.0,0.8,0.3,13.5,0.9,5.3,4.4,3.4,98.6,0.7,350.6,0.8,0.3,0.9,0.9,4.1,0.7,0.3,0.4,2.1,1.4,5.2,4.2,3.9,1.4,0.8,0.7,0.8,0.3,1.9,0.8,0.7,1.2,1.7,67.9,3.8,6.1,5.9,225.3,0.7,0.3,0.6,2.9,37.5,1.1,33.2,0.9,1.5,1.1,0.8,1.5,0.8,2.2,4.6,1.2,1.0,3.3,0.9,0.9,4.6,1.2,2.8), site_name = "community 1" ) legend_data$AQI <- case_when( legend_data$PM25 <= 9.0 ~ "1", legend_data$PM25 >= 9.1 & legend_data$PM25 <= 35.4 ~ "2", legend_data$PM25 >= 35.5 & legend_data$PM25 <= 55.4 ~ "3", legend_data$PM25 >= 55.5 & legend_data$PM25 <= 125.4 ~ "4", legend_data$PM25 >= 125.5 & legend_data$PM25 <= 225.4 ~ "5", legend_data$PM25 >= 225.5 ~ "6", TRUE ~ NA_character_ ) # 创建带图例的图表 legendplot <- ggplot(legend_data, aes(x=julian, y=AQI, fill=AQI)) + geom_tile() + scale_fill_manual( values = c("green", "yellow", "orange", "red", "purple", "maroon"), labels = c("1" = "Good", "2"="Moderate", "3" = "Unhealthy for\nSensitive Groups", "4" = "Unhealthy", "5" = "Very Unhealthy", "6" = "Hazardous") ) + theme(legend.position = "bottom") legendplot # 提取图例并尝试绘制 legend <- cowplot::get_legend(legendplot) grid.newpage() grid.draw(legend) # 此处生成空白图
原因分析
cowplot的get_legend()函数返回的是一个ggplot对象,而非grid包可直接渲染的grob(图形对象),因此直接用grid.draw()无法识别并渲染该对象,导致空白图。
解决方案
提供三种可行的解决方法,按需选择:
方法1:使用cowplot的draw_plot()绘制
cowplot自带的绘图函数对自身返回的对象兼容性最佳,直接调用即可:
# 替换原代码的grid.newpage()和grid.draw() draw_plot(legend)
方法2:转换为grob对象后用grid绘制
通过ggplot2::ggplotGrob()将ggplot对象转换为grid可识别的grob对象,再进行绘制:
# 替换原代码的最后两行 legend_grob <- ggplotGrob(legend) grid.newpage() grid.draw(legend_grob)
方法3:直接用patchwork或ggplot默认方式绘制
由于提取的图例本身是ggplot对象,可直接像普通ggplot图表一样调用显示:
# 直接运行以下代码即可显示图例 legend
内容的提问来源于stack exchange,提问作者Kelly Ireland
相关产品推荐
相关产品推荐

