如何制作直方图,其中每个条的中心位于公共轴上?这看起来像一个带有阶梯形边缘的小提琴图。
我想在 Lattice 中执行此操作,并且不介意自定义面板功能等,但很乐意使用基本 R 图形甚至 ggplot2。(我还没有投入到 ggplot2 中,但会在某个时候冒险。)
(我为什么要这样做?我认为当数据是离散的并且出现在几个 [5-50] 均匀间隔的数值上时,它可能是小提琴图的有用替代品。然后每个 bin 代表一个点。当然,我可以只生成一个正常的直方图。但我认为有时同时显示箱须图和小提琴图很有用。对于定期的离散数据,与箱线图具有相同方向的对称直方图可以进行比较数据的详细结构与箱线图,就像小提琴图一样。在这种情况下,对称直方图可能比小提琴图提供更多信息。(豆图可能是我刚才描述的另一种选择,尽管实际上我的数据并不是字面上离散的——它只是收敛到一系列常规值附近。这使得 R's 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
可以从此链接下载以 Rdata 文件中完整的 600 个观测值命名的数据框: 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 或 -.9 附近的值。13 个值的平均值约为 0.9 或 - .9 有点靠近焦点。在实践中,我通过检查数据确定了焦点的适当值,因为涉及一些额外的变化。)
可以使用以下方法制作小提琴图:
require(lattice)
bwplot(crime.v ~ bias, data=df30, ylim=c(-1,1), panel=panel.violin)
如果您使用较大的数据集运行此程序,您会看到生成的小提琴图之一是多模态的,而另一个不是。然而,这似乎并没有反映两个小提琴图背后的数据差异;据我所知,这是一个人工制品,因为焦点相对于情节的位置。我可以通过调整density
传递给 panel.violin 的参数来消除差异,但是只表示每个集群中有多少点会更清楚。
谢谢!