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

geom_pictogram图例不显示颜色问题求助

问题描述

尝试创建包含象形图、颜色和分面信息的华夫饼图:使用geom_waffle时一切正常,但改用geom_pictogram并将美学映射中的fill替换为label后,颜色图例不再显示。已尝试显式使用guides、scale_color_manual的limits参数,均无效。


数据准备代码
fig3gout <- data.frame(value=c(30,20,0,0,0,0,0,0,0,50,
30,20,2,3,0,0,0,0,0,45,
35,15,6,4,5,3,3,2,0,27,
38,12,10,15,6,4,4,3,0,8),
phase=rep(c("Baseline","Deploying a","Deploying b and c","Consolidation"),each=10),
improvement=rep(c(rep("none",2),rep("a",2),rep("b",2),rep("c",2),rep("undiagnosed",2)),4),
measure=rep(c("treated","diagnosed"),20))
fig3gout$phase <- factor(fig3gout$phase,levels=c("Baseline","Deploying a","Deploying b and c","Consolidation"),ordered=T)
fig3gout$improvement <- factor(fig3gout$improvement,levels=c("none","a","b","c","undiagnosed"))
fig3gout$measure <- factor(fig3gout$measure,levels=c("treated","diagnosed"))

正常运行的geom_waffle代码
library(ggplot2)
library(waffle)
ggplot(data=fig3gout,aes(values=value,fill=measure))+
  geom_waffle(size = 2.5, n_rows = 10, flip = TRUE,aes(color=improvement))+
  scale_fill_manual(values=c(1,2))+
  scale_color_manual(name=NULL,values=c("#873600",
                                        "#28B463",
                                        "#7D3C98",
                                        "#EC7063",
                                        "#F0F3F4"),
                     labels=c("Baseline","QI a","QI b","QI c","undiagnosed")) +
  facet_wrap(~phase,nrow=1,strip.position="bottom")+
  coord_equal() +
  theme_minimal() +
  theme(panel.grid = element_blank(), 
        panel.spacing=unit(-.2,"cm",data=NULL),
        axis.text=element_blank(),
        axis.ticks=element_blank(),
        legend.title=element_blank(),
        legend.position = c("top"),
        legend.box="vertical",
        legend.box.just = "top",
        legend.key.size = unit(1,units="cm"),
        legend.margin = margin(2, 2, 6, 6))

出现问题的geom_pictogram代码
ggplot(data=fig3gout,aes(values=value,label=measure))+
  geom_pictogram(size = 2.5, n_rows = 10, flip = TRUE,aes(color=improvement))+
  scale_label_pictogram(name=NULL,
                        values=c(diagnosed="user-plus",treated="user"))+
  scale_color_manual(name=NULL,values=c("#873600",
                                        "#28B463",
                                        "#7D3C98",
                                        "#EC7063",
                                        "#F0F3F4"),
                     labels=c("Baseline","QI a","QI b","QI c","undiagnosed")) +
  facet_wrap(~phase,nrow=1,strip.position="bottom")+
  coord_equal() +
  theme_minimal() +
  theme(panel.grid = element_blank(), 
        panel.spacing=unit(-.2,"cm",data=NULL),
        axis.text=element_blank(),
        axis.ticks=element_blank(),
        legend.title=element_blank(),
        legend.position = c("top"),
        legend.box="vertical",
        legend.box.just = "top",
        legend.key.size = unit(1,units="cm"),
        legend.margin = margin(2, 2, 6, 6))

解决方案

问题根源是geom_pictogram生成的label图例与color图例发生冲突,导致color图例被覆盖或未正确渲染。以下两种方法可修复:

方法1:强制指定color图例的渲染规则

在scale_color_manual中添加guide参数,让color图例忽略label映射,只显示颜色块:

ggplot(data=fig3gout,aes(values=value,label=measure))+
  geom_pictogram(size = 2.5, n_rows = 10, flip = TRUE,aes(color=improvement))+
  scale_label_pictogram(name=NULL,
                        values=c(diagnosed="user-plus",treated="user"))+
  scale_color_manual(name=NULL,values=c("#873600",
                                        "#28B463",
                                        "#7D3C98",
                                        "#EC7063",
                                        "#F0F3F4"),
                     labels=c("Baseline","QI a","QI b","QI c","undiagnosed"),
                     guide = guide_legend(override.aes = list(label = "")))+
  facet_wrap(~phase,nrow=1,strip.position="bottom")+
  coord_equal() +
  theme_minimal() +
  theme(panel.grid = element_blank(), 
        panel.spacing=unit(-.2,"cm",data=NULL),
        axis.text=element_blank(),
        axis.ticks=element_blank(),
        legend.title=element_blank(),
        legend.position = c("top"),
        legend.box="vertical",
        legend.box.just = "top",
        legend.key.size = unit(1,units="cm"),
        legend.margin = margin(2, 2, 6, 6))

方法2:调整美学映射优先级

将color=improvement移到全局aes中,确保color映射的图例优先级高于label:

ggplot(data=fig3gout,aes(values=value,label=measure,color=improvement))+
  geom_pictogram(size = 2.5, n_rows = 10, flip = TRUE)+
  scale_label_pictogram(name=NULL,
                        values=c(diagnosed="user-plus",treated="user"))+
  scale_color_manual(name=NULL,values=c("#873600",
                                        "#28B463",
                                        "#7D3C98",
                                        "#EC7063",
                                        "#F0F3F4"),
                     labels=c("Baseline","QI a","QI b","QI c","undiagnosed")) +
  facet_wrap(~phase,nrow=1,strip.position="bottom")+
  coord_equal() +
  theme_minimal() +
  theme(panel.grid = element_blank(), 
        panel.spacing=unit(-.2,"cm",data=NULL),
        axis.text=element_blank(),
        axis.ticks=element_blank(),
        legend.title=element_blank(),
        legend.position = c("top"),
        legend.box="vertical",
        legend.box.just = "top",
        legend.key.size = unit(1,units="cm"),
        legend.margin = margin(2, 2, 6, 6))

内容的提问来源于stack exchange,提问作者del_courv

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.30 03:25:17