如何将三角形添加到R中的ggplot2颜色栏以指示越界的值? [英] How can I add triangles to a ggplot2 colorbar in R to indicate out of bound values?

查看:15
本文介绍了如何将三角形添加到R中的ggplot2颜色栏以指示越界的值?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我想使用ggplot2绘制一张图,其中裁剪了一些填充值,即高于或低于色标限制的值显示为最小/最大颜色。我可以使用limitoob(越界)的组合使其工作如下:

library(ggplot2)
library(scales)
ggplot() + ... + scale_fill_viridis(na.value="white", limit=c(0, 10), oob=squish)

但是,颜色栏中没有任何信息表明存在超出限制的值。 如何在gglot中重现此matplotlib示例:https://stackoverflow.com/a/32072348

具体来说,如何获取色条末尾的三角形?

推荐答案

据我所知,在ggplot2中没有为Colourbar实现三角形末端的包(但如果有的话,请告诉我!)然而,我们可以实现我们自己的。我们需要一个定制向导的构造函数和一种绘制它的方法。大多数东西已经在guide_colourbar()和它们的类的方法中实现了,所以我们需要做的只是标记我们自己的类并扩展guide_gengrob方法。下面的代码应该适用于垂直方向的颜色栏。您需要了解有关grid程序包和gtable程序包的一些知识才能继续学习。

library(ggplot2)
library(gtable)
library(grid)

my_triangle_colourbar <- function(...) {
  guide <- guide_colourbar(...)
  class(guide) <- c("my_triangle_colourbar", class(guide))
  guide
}

guide_gengrob.my_triangle_colourbar <- function(...) {
  # First draw normal colourbar
  guide <- NextMethod()
  # Extract bar / colours
  is_bar <- grep("^bar$", guide$layout$name)
  bar <- guide$grobs[[is_bar]]
  extremes <- c(bar$raster[1], bar$raster[length(bar$raster)])
  # Extract size
  width  <- guide$widths[guide$layout$l[is_bar]]
  height <- guide$heights[guide$layout$t[is_bar]]
  short  <- min(convertUnit(width, "cm",  valueOnly = TRUE),
                convertUnit(height, "cm", valueOnly = TRUE))
  # Make space for triangles
  guide <- gtable_add_rows(guide, unit(short, "cm"),
                           guide$layout$t[is_bar] - 1)
  guide <- gtable_add_rows(guide, unit(short, "cm"),
                           guide$layout$t[is_bar])
  
  # Draw triangles
  top <- polygonGrob(
    x = unit(c(0, 0.5, 1), "npc"),
    y = unit(c(0, 1, 0), "npc"),
    gp = gpar(fill = extremes[1], col = NA)
  )
  bottom <- polygonGrob(
    x = unit(c(0, 0.5, 1), "npc"),
    y = unit(c(1, 0, 1), "npc"),
    gp = gpar(fill = extremes[2], col = NA)
  )
  # Add triangles to guide
  guide <- gtable_add_grob(
    guide, top, 
    t = guide$layout$t[is_bar] - 1,
    l = guide$layout$l[is_bar]
  )
  guide <- gtable_add_grob(
    guide, bottom,
    t = guide$layout$t[is_bar] + 1,
    l = guide$layout$l[is_bar]
  )
  
  return(guide)
}

然后您可以将您的自定义参考线用作刻度表中的guide参数。

g <- ggplot(mtcars, aes(mpg, wt)) +
  geom_point(aes(colour = drat))

g + scale_colour_viridis_c(
    limits = c(3, 4), oob = scales::oob_squish,
    guide = my_triangle_colourbar()
  )

没有一种自然的方法可以对越界值进行不同的颜色设置,但您可以将接近最大值的非常小的切片设置为不同的颜色。

g + scale_colour_gradientn(
    colours = c("red", scales::viridis_pal()(255), "hotpink"),
    limits = c(3, 4), oob = scales::oob_squish,
    guide = my_triangle_colourbar()
  )

reprex package(v1.0.0)于2021-07-19创建

这篇关于如何将三角形添加到R中的ggplot2颜色栏以指示越界的值?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆