【问题标题】:Continuous color bar with separators instead of ticks带有分隔符而不是刻度的连续颜色条
【发布时间】:2020-06-24 15:01:04
【问题描述】:

图片应该很好地说明我想要实现的目标。理想情况下,生成的颜色条将保持连续性,即,应该基于连续而不是离散的美学,或者至少非常接近以表现得像它。

这也意味着,不仅仅是将离散填充的图例键足够靠近的简单方法。

Yes, I could create a fake legend,但我想要一个在图例绘图级别进行修改的解决方案。

我也会对有趣的网格黑客非常满意!

library(ggplot2)

ggplot(iris, aes(Sepal.Length, y = Sepal.Width, fill = Petal.Length))+
  geom_point(shape = 21) +
  scale_fill_continuous() +
  guides(fill = guide_colorbar(ticks.colour = "black"))

这是照片处理过的,抱歉!我不想创建箭头,只是带有分隔符而不是刻度的连续刻度

最终目标是将彩条重现为orignially proposed in this thread

但是,这不是关于创建离散渐变条,这只是关于分隔符!

离散渐变条不是问题,已经有解决方案(例如,https://stackoverflow.com/a/62544405/7941188https://stackoverflow.com/a/62556763/7941188https://stackoverflow.com/a/50540633/7941188

【问题讨论】:

    标签: r ggplot2 legend


    【解决方案1】:

    ggplot v3.3.0 中引入的可扩展指南系统肯定有一个选项。请参见下面的示例:

    library(ggplot2)
    
    guide_longticks <- function(...) {
      guide <- guide_colorbar(...)
      class(guide) <- c("guide", "guide_longticks", "colorbar")
      guide
    }
    
    guide_gengrob.guide_longticks <- function(guide, theme) {
      dir <- guide$direction
      guide <- NextMethod()
      is_ticks <- grep("^ticks$", guide$layout$name)
      ticks <- guide$grobs[is_ticks][[1]]
      if (dir == "vertical") {
        ticks$x1 <- rep(tail(ticks$x1, 1), length(ticks$x1))
      } else {
        ticks$y1 <- rep(tail(ticks$y1, 1), length(ticks$y1))
      }
      
      guide$grobs[[is_ticks]] <- ticks
      guide
    }
    
    ggplot(iris, aes(Sepal.Length, y = Sepal.Width, fill = Petal.Length))+
      geom_point(shape = 21) +
      scale_fill_continuous() +
      guides(fill = guide_longticks(ticks = TRUE, ticks.colour = "black"))
    

    reprex package (v0.3.0) 于 2020 年 6 月 24 日创建

    编辑:

    如果你想在刻度之间使用平面颜色,也可以试试这个替代构造函数:

    guide_longticks <- function(...) {
      guide <- guide_colorsteps(...)
      class(guide) <- c("guide", "guide_longticks", "colorsteps", "colorbar")
      guide
    }
    

    EDIT2:

    如果您想要更清晰的矢量文件,以下 gengrob 函数也会删除较小的刻度。它有点假设它们是刻度的后半部分:

    guide_gengrob.guide_longticks <- function(guide, theme) {
      dir <- guide$direction
      guide <- NextMethod()
      is_ticks <- grep("^ticks$", guide$layout$name)
      ticks <- guide$grobs[is_ticks][[1]]
      n <- length(ticks$x0)
      if (dir == "vertical") {
        ticks$x0 <- head(ticks$x0, n/2)
        ticks$x1 <- rep(tail(ticks$x1, 1), n/2)
      } else {
        ticks$y0 <- head(ticks$y0, n/2)
        ticks$y1 <- rep(tail(ticks$y1, 1), n/2)
      }
      
      guide$grobs[[is_ticks]] <- ticks
      guide
    }
    

    【讨论】:

    • 有趣,我曾希望你们俩都能回答 :) 谢谢,这很有趣
    • 您的问题通常比“我如何制作这个堆叠的条形图?”更有趣。 :)
    • 嘿,只是一个小问题,网格仍然绘制right side small ticks - 我会尝试找出 grob 函数的变化,但可能需要提出后续问题:)
    • 只要指南继续以当前格式返回刻度,上面的编辑应该会删除额外的刻度。
    • grep("^ticks$", guide$layout$name) 真的很邪恶!我无法理解它......你怎么知道这个尚未真正存在的指南对象的结构?
    【解决方案2】:

    肯定有一个快速的网格破解 Tjebo,但它可能需要一些工作才能使其健壮(按名称而不是按数字索引):

    library(ggplot2)
    library(grid)
    
    p <- ggplot(iris, aes(Sepal.Length, y = Sepal.Width, fill = Petal.Length))+
      geom_point(shape = 21) +
      scale_fill_continuous() +
      guides(fill = guide_colorbar(ticks.colour = "black"))
    
    gt <- ggplot_gtable(ggplot_build(p))
    
    x1 <- gt$grobs[[which(gt$layout$name == "guide-box")]]$grobs[[1]]$grobs[[5]]$x1
    x1[1:7] <- x1[8:14]
    gt$grobs[[which(gt$layout$name == "guide-box")]]$grobs[[1]]$grobs[[5]]$x1 <- x1
    grid.newpage()
    grid.draw(gt)
    

    reprex package (v0.3.0) 于 2020 年 6 月 24 日创建

    【讨论】:

    • 这是一个艰难的选择,艾伦,但我决定接受 teunbrand 的回答。再次感谢一如既往,我一直在向你学习很多东西
    • 我认为这是正确的决定@Tjebo。 Teunbrand 的回答更加完整和概括。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-12-10
    • 2013-09-13
    • 1970-01-01
    • 2018-04-24
    • 2019-03-19
    相关资源
    最近更新 更多