ggplot2:带有对数比例

时间:2015-06-26 08:43:03

标签: r ggplot2

我正在尝试绘制一个点对数直方图(一个显示点而不是条形值的直方图),这是一个对数比例。结果应如下所示:

Target Graph
MWE:

让我们模拟一些数据:

set.seed(123)
d <- data.frame(x = rnorm(1000))

要获得点直方图,我需要先计算直方图数据(hdata)

hdata <- hist(d$x, plot = FALSE)
tmp <- data.frame(mids = hdata$mids, 
                  density = hdata$density, 
                  counts = hdata$counts)

我们可以像这样绘制

p <- ggplot(tmp, aes(x = mids, y = density)) + geom_point() + 
            stat_function(fun = dnorm, col = "red")
p

获取此图表: First Try

理论上我们应该能够应用对数标度(并将y限制设置为大于0),我们应该有一个与目标图相似的图片。

但是,如果我应用它,我会得到以下图表:

p + scale_y_log10(limits = c(0.001, 10))

Wrong Target

stat_function清楚地显示非缩放值,而不是在第一张图片中产生更靠近实线的数字。

有什么想法吗?

加成 有没有办法用直线图绘制直方图而不使用hist(...,plot = FALSE)函数?

编辑解决方法

一种可能的解决方案是计算ggplot之外的dnorm-data,然后将其作为一行插入。例如

tmp2 <- data.frame(mids = seq(from = min(tmp$mids), to = max(tmp$mids), 
                            by = (max(tmp$mids) - min(tmp$mids))/10000))
tmp2$dnorm <- dnorm(tmp2$mids) 

# Plot it
ggplot() + 
  geom_point(data = tmp, aes(x = mids, y = density)) + 
  geom_line(data = tmp2, aes(x = mids, y = dnorm), col = "red") + 
  scale_y_log10()

返回如下图表。这基本上是图表,但它不能解决stat_function问题。 enter image description here

2 个答案:

答案 0 :(得分:3)

library(ggplot2)
set.seed(123)
d <- data.frame(x = rnorm(1000))
ggplot(d, aes(x)) +
  stat_bin(geom = "point", 
           aes(y = ..density..),
           #same breaks as function hist's default:
           breaks = pretty(range(d$x), n = nclass.Sturges(d$x), min.n = 1), 
           position = "identity") +
  stat_function(fun = dnorm, col = "red") +
  scale_y_log10(limits = c(0.001, 10))

resulting plot

答案 1 :(得分:0)

我在重新讨论此问题时发现的另一种可能的解决方案是将log10应用于stat_function呼叫。

library(ggplot2)

set.seed(123)
d <- data.frame(x = rnorm(1000))

hdata <- hist(d$x, plot = FALSE)
tmp <- data.frame(mids = hdata$mids, 
                  density = hdata$density, 
                  counts = hdata$counts)

ggplot(tmp, aes(x = mids, y = density)) + geom_point() + 
  stat_function(fun = function(x) log10(dnorm(x)), col = "red") +
  scale_y_log10()

reprex package(v0.2.0)于2018-07-25创建。