Jua*_*blo 4 plot r histogram cdf
在R中,ecdf我可以绘制经验累积分布函数
plot(ecdf(mydata))
Run Code Online (Sandbox Code Playgroud)
并且hist我可以绘制我的数据的直方图
hist(mydata)
Run Code Online (Sandbox Code Playgroud)
如何在同一个图中绘制直方图和ecdf?
我尝试做出类似的东西
还有点晚了,这是另一个用第二个y轴扩展@Christoph解决方案的解决方案.
par(mar = c(5,5,2,5))
set.seed(15)
dt <- rnorm(500, 50, 10)
h <- hist(
dt,
breaks = seq(0, 100, 1),
xlim = c(0,100))
par(new = T)
ec <- ecdf(dt)
plot(x = h$mids, y=ec(h$mids)*max(h$counts), col = rgb(0,0,0,alpha=0), axes=F, xlab=NA, ylab=NA)
lines(x = h$mids, y=ec(h$mids)*max(h$counts), col ='red')
axis(4, at=seq(from = 0, to = max(h$counts), length.out = 11), labels=seq(0, 1, 0.1), col = 'red', col.axis = 'red')
mtext(side = 4, line = 3, 'Cumulative Density', col = 'red')
Run Code Online (Sandbox Code Playgroud)
诀窍如下:你没有为你的情节添加一条线,而是在顶部绘制另一个情节,这就是我们需要的原因par(new = T).然后你必须稍后添加y轴(否则它将在左边的y轴上绘制).
有两种方法可以解决这个问题。一种是忽略不同的尺度并在直方图中使用相对频率。这会导致直方图更难读取。第二种方法是改变一个或另一个元素的比例。
我怀疑这个问题很快就会引起您的兴趣,特别是@hadley 的回答。
这里有一个解决方案ggplot2。我不确定您会对结果感到满意,因为 CDF 和直方图(计数或相对)处于完全不同的视觉尺度。请注意,此解决方案将数据存储在mydata使用所需变量调用的数据框中x。
library(ggplot2)
set.seed(27272)
mydata <- data.frame(x= rexp(333, rate=4) + rnorm(333))
ggplot(mydata, aes(x)) +
stat_ecdf(color="red") +
geom_bar(aes(y = (..count..)/sum(..count..)))
Run Code Online (Sandbox Code Playgroud)

在这里,我将重新调整经验 CDF,以便其最大值不是具有最高相对频率的任何 bin,而不是最大值 1。
h <- hist(mydata$x, freq=F)
ec <- ecdf(mydata$x)
lines(x = knots(ec),
y=(1:length(mydata$x))/length(mydata$x) * max(h$density),
col ='red')
Run Code Online (Sandbox Code Playgroud)
