在 ggplot2 中是不是有内置的方法来做对数色标?

Posted

技术标签:

【中文标题】在 ggplot2 中是不是有内置的方法来做对数色标?【英文标题】:Is there a built-in way to do a logarithmic color scale in ggplot2?在 ggplot2 中是否有内置的方法来做对数色标? 【发布时间】:2011-12-25 13:42:57 【问题描述】:

这是一个分级密度图的示例:

library(ggplot2)
n <- 1e5
df <- data.frame(x = rexp(n), y = rexp(n))
p <- ggplot(df, aes(x = x, y = y)) + stat_binhex()
print(p)

调整色阶以使中断是对数间隔会很好,但可以尝试

my_breaks <- round_any(exp(seq(log(10), log(5000), length = 5)), 10)
p + scale_fill_hue(breaks = as.factor(my_breaks), labels = as.character(my_breaks))

导致Error: Continuous variable () supplied to discrete scale_hue. 似乎breaks 期待一个因素(也许?)并且在设计时考虑了分类变量?

我将发布一个未内置的解决方法作为答案,但我想我可能只是在使用 scale_fill_hue 时迷失了方向,我想知道我是否有任何明显的问题不见了。

【问题讨论】:

您使用的配色方案是什么?真的很好看!也许自 2011 年以来默认的 ggplot 颜色发生了变化?我只是得到了蓝色的阴影。 当时是默认的。 【参考方案1】:

另一种方式,在stat_summary_hex中使用自定义函数:

ggplot(cbind(df, z = 1), aes(x = x, y = y, z = z)) + 
  stat_summary_hex(function(z)log(sum(z)))

这现在是ggplot 的一部分,但最初是受到@kohske 在this answer 中的精彩代码的启发,该代码提供了一个自定义stat_aggrhex。在 ggplot > 2.0 的版本中,使用上面的代码(或其他答案)

ggplot(cbind(df, z = 1), aes(x = x, y = y, z = z)) +
    stat_aggrhex(fun = function(z) log(sum(z))) +
    labs(fill = "Log counts")

生成此图。

【讨论】:

审美是fill,可能不是colour @Andrie,谢谢!对我来说,这似乎比使用调色板来获得在对数刻度上均匀分布的颜色要自然得多。 对我来说似乎不太自然。但总是可以转换数据或规模。变换尺度会给你一个明智的传说。 @hadley,好吧,既然我找到了transscale\_gradient 的参数,我同意。首先,“自然”可能也是一个糟糕的词选择,我认为我在寻找“语法简单”的东西,并且错误地认为(现在接受的)答案会更复杂。这就是我没有阅读帮助文件中所有示例的结果! @LingZhang 正如@kohske 在他的回答中所写,现在可以由ggplot(cbind(df, z = 1), aes(x = x, y = y, z = z)) + stat_summary_hex(function(z)log(sum(z))) 存档,希望对您有所帮助【参考方案2】:

是的! scale_fill_gradient 有一个 trans 参数,我之前错过了。有了它,我们可以得到一个具有适当图例和色标以及简洁语法的解决方案。使用问题中的pmy_breaks = c(2, 10, 50, 250, 1250, 6000)

p + scale_fill_gradient(name = "count", trans = "log",
                        breaks = my_breaks, labels = my_breaks)

我的另一个答案最适合用于更复杂的数据功能。 Hadley 的评论鼓励我在 ?scale_gradient 底部的示例中找到这个答案。

【讨论】:

伙计,对于同一个问题,您有两个“最佳”答案:-)。太棒了! @Eduardo... 这个问题也是我的。很高兴您发现它很有用! 好吧,log or log10 or sqrt 是bulit_in函数,现在我想通过除1000进行转换,所以我在包scales中使用trans_new函数并编写自己的funcsci_trans &lt;- function() trans_new('sci', function(x) x/1000, function(x) x*1000) p + scale_fill_gradient(trans='sci'),但它不起作用,我该怎么办?谢谢 我注意到这适用于所有使用continuous_scale(例如scale_fill_continuous)的比例函数,而不仅仅是scale_fill_gradient 这个公式在 R 3.6.3 中仍然有效。

以上是关于在 ggplot2 中是不是有内置的方法来做对数色标?的主要内容,如果未能解决你的问题,请参考以下文章

ggplot2 轴:设置间隔、对数刻度和指数而不是科学

在R中标记对数刻度显示

如何在ggplot2中使用多色拟合线将颜色分配给多色散点图

用 ggplot2 注释 R 中的矩形以获得对数刻度的图形

R:如何使用 ggplot2 创建一个半色半数的热图?

R语言ggplot2可视化处理y轴坐标数值极大的情况:对数坐标(log10)