如何制作一个直方图,使每个柱子的中心都沿着一个公共轴线?这看起来像是一种具有阶梯状边缘的小提琴图。
我想在Lattice中实现这个功能,而且不介意自定义面板函数等。但我也很乐意使用基本的R图形甚至ggplot2。(虽然我还没有完全掌握ggplot2,但我会在某个时候尝试。)
(为什么要这样做?当数据离散并以几个[5-50]均匀间隔的数字值发生时,我认为它可能是小提琴图的一个有用替代。然后,每个箱表示一个点。当然,我可以只生成一个普通直方图。但我认为有时同时显示盒图和小提琴图是有用的。对于间隔规则的离散数据,与盒图相同方向的对称直方图允许将数据的详细结构与盒图进行比较,就像小提琴图一样。在这种情况下,对称直方图可能比小提琴图更有信息量。(豆形图可能是我刚才描述的另一种选择,但实际上我的数据并不是真正的离散的 - 它只是接近一系列常规值。除非我通过将值映射到最近的常规值来对值进行归一化,否则R的beanplot包对我不是很有用。))
这是某些数据的30个观察子集,由基于代理的模拟生成:
您可以从以下链接下载一个名为
如果您运行较大的数据集,则会发现产生的其中一个小提琴图是多峰的,而另一个不是。但是,这似乎并不反映出两个小提琴图底层数据的差异;就我所知,这是由于焦点位置与图形之间的关系而导致的人为因素。通过调整传递给panel.violin的密度参数,我可以平滑掉差异,但更清晰的方法是表示每个聚类中有多少个点。
谢谢!
我想在Lattice中实现这个功能,而且不介意自定义面板函数等。但我也很乐意使用基本的R图形甚至ggplot2。(虽然我还没有完全掌握ggplot2,但我会在某个时候尝试。)
(为什么要这样做?当数据离散并以几个[5-50]均匀间隔的数字值发生时,我认为它可能是小提琴图的一个有用替代。然后,每个箱表示一个点。当然,我可以只生成一个普通直方图。但我认为有时同时显示盒图和小提琴图是有用的。对于间隔规则的离散数据,与盒图相同方向的对称直方图允许将数据的详细结构与盒图进行比较,就像小提琴图一样。在这种情况下,对称直方图可能比小提琴图更有信息量。(豆形图可能是我刚才描述的另一种选择,但实际上我的数据并不是真正的离散的 - 它只是接近一系列常规值。除非我通过将值映射到最近的常规值来对值进行归一化,否则R的beanplot包对我不是很有用。))
这是某些数据的30个观察子集,由基于代理的模拟生成:
df30 <- data.frame(crime.v=c(0.2069526, 0.2063516, 0.06919754,
0.2080366, -0.06975912, 0.206277, 0.3457634, 0.2058985, 0.3428499,
0.3428159, 0.06746109, -0.07068694, 0.4826098, -0.06910966, 0.06769761,
0.2098732, 0.3482267, 0.3483602, 0.4829777, 0.06844112, 0.2093492,
0.4845478, 0.2093505, 0.3482845, 0.3459249, 0.2106339, 0.2098397,
0.4844956, 0.2108985, 0.2107984), bias=c("beast", "beast", "beast",
"beast", "beast", "beast", "beast", "beast", "beast", "beast", "beast",
"beast", "beast", "beast", "beast", "virus", "virus", "virus", "virus",
"virus", "virus", "virus", "virus", "virus", "virus", "virus", "virus",
"virus", "virus", "virus"))
您可以从以下链接下载一个名为
df
的数据框,其中包含600个完整的观测值的R数据文件:CVexample.rdata。
crime.v
值接近以下某个点,我称其为聚焦点:
[1] -0.89115386 -0.75346155 -0.61576924 -0.47807693 -0.34038463 -0.20269232 -0.06500001
[8] 0.07269230 0.21038460 0.34807691 0.48576922 0.62346153 0.76115383 0.89884614
(crime.v
的值实际上是 13 个变量的平均值,这些变量的值可以在 -1 到 1 的范围内变化,但最终会收敛到大约为 0.9 或 -0.9 的值。13 个值在约为 0.9 或 -0.9 的平均值在某种程度上接近于焦点。在实践中,我通过检查数据来确定焦点的适当值,因为涉及一些额外的变化。)
可以使用以下代码生成小提琴图:
require(lattice)
bwplot(crime.v ~ bias, data=df30, ylim=c(-1,1), panel=panel.violin)
如果您运行较大的数据集,则会发现产生的其中一个小提琴图是多峰的,而另一个不是。但是,这似乎并不反映出两个小提琴图底层数据的差异;就我所知,这是由于焦点位置与图形之间的关系而导致的人为因素。通过调整传递给panel.violin的密度参数,我可以平滑掉差异,但更清晰的方法是表示每个聚类中有多少个点。
谢谢!