You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.14 11:10:02