【问题标题】:ggplot2 and log scale don't show values = 1ggplot2 和对数刻度不显示值 = 1
【发布时间】:2021-02-15 23:24:03
【问题描述】:

我想绘制一个带有对数刻度 y 轴的图表:

data <- data.frame(x = seq_len(5), y = c(2,1,100,500,30))
ggplot(data) + aes(x,y) + geom_col() + scale_y_log10()

但是因为水平轴总是在 y = 1 处与垂直轴相交,所以永远不会绘制 y = 1 的条形图。

我知道 log(1) = 0,但我可以将绘图基数设置为 0.1 以让条形图从 1 以下开始吗?

【问题讨论】:

  • 我们可以作弊:ggplot(data) + aes(x, y + 0.1) + geom_col() + scale_y_log10()
  • 我想我在这里错过了重点。该图是正确的:Y 轴上的值是对数变换的,因此零变为 1; log10(1) 为零,所以你看不到小节 2 是正确的。你的目标是什么?
  • 一种选择是强制在条形周围画一条线 - 例如geom_col(colour = "grey20"),这样你至少在 y=1 处得到一条线。

标签: r ggplot2 geom-col


【解决方案1】:

你不能只将 y 的值乘以 10,然后将标签除以相同的数量吗?

ggplot(data) + aes(x, y * 10) +  geom_col() + 
  scale_y_log10(labels = function(x) x/10, name = "y")

你可以用直方图做同样的事情:

set.seed(2)
ggplot(data.frame(x = rnorm(1000)), aes(x)) + 
  geom_histogram(aes(y = ..count.. * 10), color = "black", fill = "gold") +
  scale_y_log10(labels = function(x) x/10, name = "count")

【讨论】:

  • 这是一个好主意,正是我想要的。谢谢。
【解决方案2】:

另一种解决方案是将条形的底部放置在-Inf,这样log10(1) 仍然会出现。这有点棘手,因为您必须将条形重新参数化为矩形并让 geom 了解 -Inf 是在比例转换之后。

library(ggplot2)

data <- data.frame(x = seq_len(5), y = c(2,1,100,500,30))

ggplot(data) + 
  geom_rect(
    aes(xmin = x - 0.45, xmax = x + 0.45,
        ymin = stage(1, after_scale = -Inf), ymax = y)
  ) +
  scale_y_log10()

reprex package (v0.3.0) 于 2020 年 11 月 3 日创建

【讨论】:

  • 我要打印的不仅仅是geom_col,还有直方图。您的解决方案是手动绘制框,但如果我想使用直方图计算,这将不起作用。我希望有一个我目前还没有找到的小参数。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-11-25
  • 2011-03-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多