首页 > 其他分享 >如何定义ggplot2 的scale_fill_manual() 中参数 values 的命名向量?

如何定义ggplot2 的scale_fill_manual() 中参数 values 的命名向量?

时间:2024-11-04 20:45:54浏览次数:4  
标签:scale manual values 命名 向量 fill

需求背景

对 R 语言中,ggplot2 的 scale_fill_manual() 函数的 values 参数理解不到位,它这里需要的是一个命名向量,无法在c() 函数内部直接创建一个向量。

举例说明,以不同分类数据的条形图来作为图例。

比如我有14个不同物种,绘制其不同颜色的条形图,注意颜色不能随便定义,需要指定每个物种对应的图例颜色,以便与其他图形颜色统一。

col2 <- c(brewer.pal(12,"Paired"),"#CCEBC5","#FFED6F")
col2
unique(type2$Species)
leg <- data.frame(Species=unique(type2$Species),Count=rep(1,length(unique(type2$Species))))
leg$Species <- factor(leg$Species,levels = unique(type2$Species))


> head(leg)
                 Species Count
1            SpeciesA     1
2            SpeciesB     1
3            SpeciesC     1
4            SpeciesD     1
5            SpeciesE     1
6            SiritiaF     1

一开始的做法,又长又臭:

pp <- ggplot(leg,aes(Species,Count,fill=Species))+
  geom_bar(stat = "identity",width = 0.5)+
  coord_flip()+
  scale_fill_manual(values = c(unique(type2$Species)[1]=col2[1],
                             unique(type2$Species)[2]=col2[2],
                             unique(type2$Species)[3]=col2[3],
                             unique(type2$Species)[4]=col2[4],
                             unique(type2$Species)[5]=col2[5],
                             unique(type2$Species)[6]=col2[6],
                             unique(type2$Species)[7]=col2[7],
                             unique(type2$Species)[8]=col2[8],
                             unique(type2$Species)[9]=col2[9],
                             unique(type2$Species)[10]=col2[10],
                             unique(type2$Species)[11]=col2[11],
                             unique(type2$Species)[12]=col2[12],
                             unique(type2$Species)[13]=col2[13],
                             unique(type2$Species)[14]=col2[14]))+
  labs(x="",y="")+
  theme_bw()+
  theme(panel.grid.major = element_blank(),
        panel.grid.minor = element_blank(),
        panel.border = element_blank(),
        legend.position = "none",
        axis.text.y = element_text( face = "italic"),
        axis.ticks = element_blank(),axis.text.x = element_blank());pp
        

报错:

图片

原因分析

在 R 语言中,ggplot2 的 scale_fill_manual() 函数的 values 参数需要一个命名向量作为输入,其中向量的名称(即键)是因子级别,向量的值(即值)是对应的颜色。

在上面的代码中,试图在 c() 函数内部创建一个向量,并使用 unique(type2$Species)[1] = col2[1] 这样的语法来命名向量元素。但是,这种语法在 c() 函数内部是无效的,因为 c() 函数不会创建命名向量,它只是将元素组合成一个向量。

正确的方法是创建一个命名向量,然后将其传递给 scale_fill_manual() 的 values 参数。

纠错

以下是一个修正后的代码示例,简洁易懂。

# 假设 col2 是颜色向量,type2$Species 是因子级别
# 创建一个命名向量,其中名称是因子级别,值是颜色
fill_colors <- setNames(col2, unique(type2$Species))
# 使用这个命名向量在 scale_fill_manual 中设置颜色
pp <- ggplot(leg,aes(Species,Count,fill=Species))+
  geom_bar(stat = "identity",width = 0.5)+
  coord_flip()+
  scale_fill_manual(values = fill_colors) +
  labs(x="",y="")+
  theme_bw()+
  theme(panel.grid.major = element_blank(),
        panel.grid.minor = element_blank(),
        panel.border = element_blank(),
        legend.position = "none",
        axis.text.y = element_text( face = "italic"), 
        axis.ticks = element_blank(),axis.text.x = element_blank());pp
        
# 确保 col2 向量的长度与 unique(type2$Species) 的长度相匹配,否则会导致颜色设置不正确。

图形结果:

图片

图片

标签:scale,manual,values,命名,向量,fill
From: https://www.cnblogs.com/miyuanbiotech/p/18526201

相关文章

  • 【语义分割|代码解析】CMTFNet-4: CNN and Multiscale Transformer Fusion Network 用
    【语义分割|代码解析】CMTFNet-4:CNNandMultiscaleTransformerFusionNetwork用于遥感图像分割!【语义分割|代码解析】CMTFNet-4:CNNandMultiscaleTransformerFusionNetwork用于遥感图像分割!文章目录【语义分割|代码解析】CMTFNet-4:CNNandMultiscale......
  • qt标题,解决title的png图片scaled后显示有明显锯齿
    一、通用方法(使用Qlabel)//添加窗口图标iconLabel=newQLabel(this);QPixmapiconPixmap(":/ico.png");//替换成你的图标文件路径iconLabel->setPixmap(iconPixmap.scaled(125,35,Qt::KeepAspectRatio,Qt::SmoothTransformation));iconLayout->addWidget(iconLabel);......
  • 【241027-论文阅读】DGraph: A Large-Scale Financial Dataset for Graph Anomaly Det
    DGraph:ALarge-ScaleFinancialDatasetforGraphAnomalyDetectionDGragh是一个用于图异常检测(graghanomalydetection,GAD)的大型金融数据集。它包含300w个节点、400w个动态边和100w个ground-truth节点。作者在关注的问题大领域:图异常检测(GAD)现实世界场景中,异常是普遍......
  • Ubuntu服务器搭建Tailscale Derp节点
    DerpServer简介Tailscale的终极目标是让任何位置的两台机器建立点对点连接,但现实中,大多数情况下,机器位于NAT和防火墙后面,这时就需要通过打洞实现NAT穿透。Tailscale的私钥仅保存在当前节点,因此DERP服务器无法解密流量,只能像其他互联网路由器一样,将加密流量从一个节点......
  • CSC3100 Problem Scale & Subtasks
    RequirementsCode(90%)YoucanwriteyourcodeinJava,Python,C,orC++.Thetimelimitmayvaryamongdifferentlanguages,dependingontheperformanceofthelanguage.Yourcodemustbeacompleteexcutableprograminsteadofonlyafunction.Weg......
  • Scaled Dot-Product Attention 的公式中为什么要除以 $\sqrt{d_k}$?
    ScaledDot-ProductAttention的公式中为什么要除以\(\sqrt{d_k}\)?在学习ScaledDot-ProductAttention的过程中,遇到了如下公式\[\mathrm{Attention}(\mathbf{Q},\mathbf{K},\mathbf{V})=\mathrm{softmax}\left(\dfrac{\mathbf{Q}\mathbf{K}}{\sqrt{d_k}}\righ......
  • 【论文阅读】【IEEE TGARS】RRNet: Relational Reasoning Network WithParallel Multi
    引言任务:光学遥感显著目标检测-关系推理论文地址:RRNet:RelationalReasoningNetworkWithParallelMultiscaleAttentionforSalientObjectDetectioninOpticalRemoteSensingImages|IEEEJournals&Magazine|IEEEXplore代码地址:rmcong/RRNet_TGRS2021(g......
  • MySQL 5.7 Reference Manual Optimization Overview(翻译)
    使用Kimi翻译文档地址:https://dev.mysql.com/doc/refman/5.7/en/optimize-overview.html目录8.1OptimizationOverview在数据库层面进行优化在硬件层面进行优化平衡可移植性和性能8.1OptimizationOverview数据库性能取决于数据库层面的多个因素,例如表、查询和配置设置。这......
  • MySQL 5.7 Reference Manual Optimizing SQL Statements(翻译)
    使用Kimi翻译文档地址:https://dev.mysql.com/doc/refman/5.7/en/optimize-overview.html目录8.2OptimizationOverview8.2.1优化SELECT语句8.2.2优化子查询、派生表和视图引用8.2.3优化INFORMATION_SCHEMA查询8.2.4优化数据变更语句8.2.5优化数据库权限8.2.6其他优化技巧......