使用 ggplot2 沿平滑曲线绘制直方图或密度
Posted
技术标签:
【中文标题】使用 ggplot2 沿平滑曲线绘制直方图或密度【英文标题】:Drawing histograms or densities along smooth curves using ggplot2 【发布时间】:2015-02-23 08:59:28 【问题描述】:有没有一种通用的方法来绘制密度(小提琴图)或直方图,显示x
沿着平滑的(x,y)
曲线的分布?当有多个组时,我使用这种方法来显示x
的边际分布(例如,一个面板上的不同曲线,由不同的颜色描绘)。
这是一个使用Hmisc
包的plsmo
函数获取分层黄土曲线和尖峰直方图的示例,显示sex
特定于age
的数据密度。
require(Hmisc)
set.seed(1)
age <- rnorm(500, 50, 15)
y <- sample(0:1, 500, TRUE)
sex <- sample(c('female','male'), 500, TRUE)
plsmo(age, y, group=sex, col=1:2,
datadensity=TRUE, scat1d.opts=list(nhistSpike=20))
【问题讨论】:
如何指定平滑曲线?有一个reproducible example 可以帮助您查看您的输入内容。 我无法理解 plsmo 正在估计和绘制的内容。我会想象你正在描述一维密度:densityplot(~age, groups=sex, data=dat)
,ggplot2 对应物将是:p <- ggplot( data=dat, aes( x=y, y=age, group=sex))+geom_violin(); print(p)
plsmo
使用 lowess()
估计 x 和 y 之间的关系,然后计算高分辨率直方图的元素,以便在分组变量上分布 x
条件并将直方图投影到lowess
曲线。
我怀疑您是否能够在不创建自己的自定义函数的情况下实现任何接近此的目标。我想你可以修改你自己的plsmo
来使用ggplot
。 sat_smooth()
已经在做黄土部分了,剩下的就是像在plsmo
函数中一样添加直方图
是的,我有一个新功能可以创建一个图层以添加到ggplot()
- 请参阅github.com/harrelfe/rms/blob/master/R/ggplot.Predict.s。但是这个函数必须提供ggplot
对象已知的冗余信息,并且该函数采用已经平滑的数据而不是原始数据。我还创建了一个新的geom
-- geom_plsmo
-- 以使用非常快的lowess()
但geom_plsmo
不会将直方图添加到曲线中。
【参考方案1】:
我相信你可以用 ggsubplot 包做到这一点。请参阅 the article 和 the package。 我相信代码看起来像:
qplot(age, y, data = dataset, color = sex) +
geom_subplot(aes(x, y, data = distributions, group = sex,
subplot = geom_violin(aes(x, y, data = distributions))))
但我不认为您的示例在您的示例中提供了足够的细节来在曲线上的点处创建小提琴。除非我误解了你的问题。
【讨论】:
感谢我感兴趣地阅读的优秀文章的指针。我还没有弄清楚子图是否允许我与主层逐点协调,这需要沿着现有的绘制曲线添加诸如尖峰直方图之类的东西。我注意到这篇文章没有引用 Daniel Carr 的工作或温度计图。以上是关于使用 ggplot2 沿平滑曲线绘制直方图或密度的主要内容,如果未能解决你的问题,请参考以下文章
R语言使用ggplot2包的快速可视化函数qplot绘制散点图(添加平滑曲线与标准差带)实战
R语言可视化包ggplot2绘制平滑曲线回归线实战:geom_smooth() 函数
R语言ggplot2可视化:应用pivot_longer函数将数据从宽格式转换为长格式为dataframe的每一列绘制密度图和直方图(堆叠)
R语言使用car包的scatterplotMatrix函数绘制散点图矩阵并添加线性回归曲线平滑曲线以及对角线核密度图和轴须图rugcor函数计算变量两两相关性