创建一个有断裂和密度的条形图

时间:2011-12-22 01:49:08

标签: r graphics plot ggplot2 histogram

我希望创建一种特定的条形图,并且不是ggplot2或R图形的专家。每个条的高度对应于下面的密度向量。

每个条形的x轴断裂在断裂向量中标识。 (密度和断裂矢量的长度始终相同。)。休息是连续的。我可以保证所有断点的断点之间的宽度相同(在下面的示例中,每个间隔的宽度为.2)。

如何在R中创建此图表,使得条形的高度为密度,条形的宽度和开始/结束由间隔矢量确定?

# density for each bar
density = c(0, 2.43053372991266e-05, 0, 2.56155325481663e-05, 7.85928661230842e-05, 
6.65974683477407e-05, 0.000191167180262139, 0.000391190191728852, 
0.000773173013145194, 0.000994581155560843, 0.00186993240600829, 
0.00301523228215973, 0.0024027636820586, 0.00178958309972533, 
0.00197757576002083, 0.0037305807759235, 0.00751360121824956, 
0.0161785199339545, 0.0285084660871918, 0.0470377898959775, 0.0749650429960432, 
0.0995404136577645, 0.122970891515022, 0.137345727945268, 0.129721517357472, 
0.111609726931989, 0.0833285279873897, 0.0569221001742823, 0.034426013022441, 
0.0191745738000343, 0.00810133792335031, 0.00342022026994395, 
0.00120148435128416, 0.000598579482992183, 5.22199596137814e-05, 
5.23550471126253e-05, 0)

# breaks for barplot
breaks = c(-4.6, -4.4, -4.2, -4, -3.8, -3.6, -3.4, -3.2, -3, -2.8, -2.6, 
-2.4, -2.2, -2, -1.8, -1.6, -1.4, -1.2, -1, -0.8, -0.6, -0.399999999999999, 
-0.199999999999999, 0, 0.2, 0.4, 0.600000000000001, 0.800000000000001, 
1, 1.2, 1.4, 1.6, 1.8, 2, 2.2, 2.4, 2.6)

为了说明,第一个条的密度为0%。条形的范围对应于-Inf至-4.6。下一个条的高度为2.43e-05,x轴的条形在x轴上的范围为-4.6到-4.4。第二个条的高度为0,x轴的条形宽度在x轴上为-4.4到-4.2,依此类推。最后一根条的密度为0%,范围从2.6到无穷大。 (当然,我们会将绘图对象的xlim设置为中断的最小值和最大值,以便不绘制0%密度的第一个和最后一个条形图)。

2 个答案:

答案 0 :(得分:4)

Barplot包含所有内容:

barplot(density, names.arg=breaks)

这将消除第一个和最后一个条目:

barplot(density[-c(1,length(density))], names.arg=breaks[-c(1,length(density))] )

为了使您的描述与您的数据相匹配,您需要比剪切点矢量更多的观察密度;这将省略“密度”的两端,并绘制可能是间隔的字符标签的正确向量,但您需要检查带有标签的值的注册:

opar <- par(mar=c(6, 4, 3, 2) + 0.1)
str.breaks <- paste(format(breaks[-length(breaks)], scientific=3),
                              "  to ", format(breaks[-1], scientific=3), sep="")
barplot(density[-c(1,length(density))], names.arg=str.breaks[-1], las=2 )
par(opar)

enter image description here

答案 1 :(得分:3)

这是一个ggplot2版本:

df <- data.frame(
  xmin = breaks,
  xmax = c(breaks[-1], Inf),
  ymin = 0,
  ymax = density)

ggplot(df, aes(xmin = xmin, xmax = xmax, ymin = ymin, ymax = ymax)) + 
  geom_rect(colour = "grey80")

enter image description here