在ggplot2中复制带有颜色渐变的“温度计”

问题描述 投票:0回答:1

我需要使用(希望如此)ggplot2 复制一个类似“温度计”的图表,这样我就可以将它放在 Shiny 应用程序中。 甚至有可能实现这样的目标吗?事实上,我只需要一个 每个地块都有一个温度计,我什至不需要多个。一旦我对其进行 Shiny-fy,用户将更改输入,温度计颜色也会改变,但颜色渐变应始终保持一致。 我只需要帮助在 ggplot2 中完成初始温度计,我完全不知道如何做圆边、渐变、旁边的图标等。

谢谢!

r ggplot2 gradient
1个回答
0
投票

您可以构建指南扩展。首先,我们需要一个构造函数,它只需将一个新参数

max
传递给指南,该参数将作为温度计中“水银”上升的水平。

library(ggplot2)

guide_thermometer <- function(max, ...) {
  new_guide(
    max = max,
    ...,
    super = GuideThermometer
  )
}

接下来我们需要一个新的引导类。下面,我们继承了 colorbar 指南,注册

max
参数并调整
build_decor()
函数。调整的要点是我们使用圆角矩形来剪辑渐变并用作框架。


GuideThermometer <- ggproto(
  "GuideThermometer", GuideColourbar,
  
  params = c(GuideColourbar$params, list(max = NULL)),
  
  build_decor = function(decor, grobs, elements, params) {
    if (!is.null(params$max)) {
      decor$colour[decor$value > params$max] <- NA
    }
    grobs <- GuideColourbar$build_decor(decor, grobs, elements, params)
    rounded <- grid::roundrectGrob(
      r = unit(0.5, "snpc"), 
      gp = grid::gpar(fill = NA)
    )
    grobs$frame <- rounded
    grobs$bar <- grid::editGrob(
      grobs$bar,
      vp = grid::viewport(clip = rounded)
    )
    grobs
  }
)

最后,您可以使用如下所示的新指南。添加笑脸只需在指南中设置正确的

breaks
label
即可。

ggplot(mpg, aes(displ, hwy, colour = cty)) +
  geom_point() +
  scale_colour_viridis_c(
    guide = guide_thermometer(max = 25),
    breaks = 25, label = "\u263a"
  ) +
  theme(legend.text = element_text(size = 16))

创建于 2024-04-12,使用 reprex v2.1.0

免责声明:我不知道这会如何闪亮。我认为,由于剪切路径的原因,可能需要使用支持 R 4.1.0 中引入的图形功能的设备。

© www.soinside.com 2019 - 2024. All rights reserved.