在plot()中添加类似于hist()的条形图

3
我想在已经生成的plot()窗口上添加一个变量分布的直方图。该脚本已经定制,我只能进行添加,不能使用hist()绘制。x轴是连续比例尺,y轴是概率[0,1](编辑:其中一个y轴是概率,另一个是连续的)。如何添加条形图以表示已生成的plot()中的该变量的分布?请使用基础R。
到目前为止,我所做的是plot(),然后用lines(hist()$breaks, hist()$density, type="h")进行分布,但是这只给我画线而不是hist()的盒状条形。
据我所了解,boxplot()不会有帮助,barplot()需要分类变量而不是连续比例尺变量(如我所拥有的变量)。
更新:对于我来说,hist(...,add=T)选项不起作用。我想像在line()解决方案中一样灵活(因此能够转换x和y向量),但是除了线条之外,还要绘制箱体。有什么想法吗?

试图一遍又一遍地重新阅读您的问题标题,我认为英文中一定有错误...但是我不知道如何纠正它。 - Tomas
将直方图添加到现有的绘图窗口? - Scott Ritchie
完成。感谢您的修正。 - ECII
3个回答

6

你的lines()想法可能可行,但是你需要使用mids作为x值的断点,同时使用lwd=参数使你的线条更宽。参数lend="butt"将确保线条没有圆角。

set.seed(123)
x<-rnorm(100)
zz<-hist(x)

plot(x=c(-2.5,2.5),y=c(0,1),type="n")
lines(zz$mids, zz$density, type="h",lwd=50,lend="butt")

更新

要得到类似于方框的效果(因为那些线条不可更改,只能更改它们的填充),您可以使用两条颜色和宽度不同的线条相叠,然后将所有密度值略微更改。

plot(x=c(-2.5,2.5),y=c(0,1),type="n")
lines(zz$mids, zz$density, type="h",lwd=50,lend="butt")
lines(zz$mids, zz$density-0.005, type="h",lwd=48,lend="butt",col="white")

enter image description here


谢谢你的$mid提示(+1)。有没有办法画出盒子而不是线条lwd=50 - ECII
1
不错,但请注意hist实际上使用的是rect而不是lines - Tomas

5
你可以通过添加 add = TRUE 来将 hist() 绘图简单地添加到已有的绘图中。不要忘记使用 freq = FALSE 表示您想要概率刻度,而不是计数刻度。
set.seed(123)
x<-rnorm(100)

plot(x, exp(x)/(1+exp(x)), col = "green") # some plot
hist(x, freq = FALSE, add = TRUE)

编辑: 如果您需要对计算的直方图进行任何操作,可以将hist调用替换为将其拆分为计算和绘图本身的操作,这是通过使用rect()(请参见 plot.histogram 的源代码)进行的:

h <- hist(x, plot = FALSE) # computation
rect(h$breaks[-length(h$breaks)], 0, h$breaks[-1], h$intensities) # plotting

enter image description here


谢谢,但由于自定义的y轴限制(我无法更改),它并不完全适用。请使用x<-rnorm(100, mean=10, sd=5)进行检查。hist()函数是如何绘制“箱子”的? - ECII
@ECII,好问题。hist()实际上使用rect()函数绘制箱子。请查看我的更新答案。 - Tomas

1
您可以简单地在由 hist 返回的对象上调用 lines
h <- hist(..., plot=FALSE)
# Other plotting functions go here.
lines(h) # will now plot the histogram in the plotting window.

谢谢,但我不能使用这个。请查看我的评论,针对Thomas的回答。 - ECII
我已经阅读了更新和评论,但是我不明白为什么hist使用rect会有问题? - Scott Ritchie

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接