我正在尝试绘制一个点对数直方图(一个显示点而不是条形值的直方图),这是一个对数比例。结果应如下所示:
的 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
获取此图表:
理论上我们应该能够应用对数标度(并将y限制设置为大于0),我们应该有一个与目标图相似的图片。
但是,如果我应用它,我会得到以下图表:
p + scale_y_log10(limits = c(0.001, 10))
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问题。
答案 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))
答案 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创建。