создание барплота с перерывами и плотностями - PullRequest
1 голос
/ 22 декабря 2011

Я хочу создать определенный тип барплота и не разбираюсь в графике ggplot2 или R. Высота каждого столбца соответствует вектору плотности ниже.

Разрывы по оси x для каждого стержня указаны в векторе разрывов. (Длина плотности и вектор разрывов всегда одинаковы.). Перерывы смежные. Я могу гарантировать, что ширина между точками останова одинакова для всех разрывов (в приведенном ниже примере ширина равна 0,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 имеет полосу от -4,6 до -4,4 по оси X. Второй столбец имеет высоту 0, а ось x имеет ширину стержня в диапазоне от -4,4 до -4,2 по оси X, и так далее. Последний бар имеет плотность 0% и колеблется от 2,6 до бесконечности. (Естественно, мы установили бы xlim объекта графика на минимальные и максимальные разрывы, чтобы первый и последний бары с плотностью 0% не отображались).

Ответы [ 2 ]

4 голосов
/ 22 декабря 2011

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

3 голосов
/ 23 декабря 2011

вот версия 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

...