Центр тяжести гистограммы в R

Допустим, у вас есть вектор, и вы делаете его гистограмму в R. Как вычислить центроид / центр тяжести барплота?

x<-cumsum(rnorm(50,1,2)) 
par(mfrow=c(1,2))
plot(x,type="l")
barplot(x)
par(mfrow=c(1,1))

Здесь есть много ответов о центре тяжести многоугольника , но я не уверен, какие точки мне нужны, чтобы получить всю форму гистограммы, а не только вектор с точками (как в левом сюжет).


person MisterH    schedule 04.08.2017    source источник


Ответы (2)


Вы можете легко вычислить его с помощью этой функции

getCentroid <- function(x, width = 1) {
  A  <- x * width                  # area of each bar
  xc <- seq(width/2, length(x), 1) # x coordinates of center of bars
  yc <- x/2                        # y coordinatey

  cx <- sum(xc * A) / sum(A)
  cy <- sum(yc * A) / sum(A)
  return(list(x = cx, y = cy))
}
points(getCentroid(x), col = 'red', pch = 19)

Примечания. Ширина каждого стержня по умолчанию равна 1. Координата x центра масс двух стержней может быть вычислена по формуле

введите здесь описание изображения

То же самое относится и к координате y. Это может быть расширено до большего количества баров.

введите здесь описание изображения


Поскольку у нас нет идеального треугольника, всегда будет ошибка, если мы будем сравнивать центроиды. Например, взяв бары с одинаковой разницей в высоте, например

x <- seq(0, 1, length.out = 1000)

(где первая полоса имеет высоту 0) всегда будет давать ошибку в координате x 1/6 (2000/3 по сравнению с 666,83333) . Причина в недостающей площади из-за того, что у нас нет идеального треугольника. Эта отсутствующая площадь равна 0,5 (подумайте о разнице в высоте и умножьте ее на ширину полосы. Суммируя это по всем полосам и разделив на 2, получается....).

person Martin Schmelzer    schedule 04.08.2017

Центроид каждого бара находится в его геометрическом центре, поэтому вы можете использовать подход для "A_system_of_particles ".

M = Sum(Height[i])        for all i
cx = Sum(Height[i] * i) / M 
cy = Sum(Height[i] * Height[i] / 2) / M 
person MBo    schedule 04.08.2017
comment
Привет, MBo, я имел в виду COG всего сюжета, а не каждого бара в отдельности. - person MisterH; 04.08.2017
comment
Да, (cx,cy) - координаты центра тяжести всего участка. - person MBo; 04.08.2017
comment
Тогда почему, когда вы принимаете за x‹-seq(0,18,length.out=18), он не лежит в точке с координатами (12,6)? Известно, что центроид прямоугольного треугольника (с одинаковой плотностью) находится в точке (основание/3, высота/3)? - person MisterH; 04.08.2017
comment
У меня есть 12,33 6,17 для этих данных (обратите внимание, что лестница не является точным треугольником). Для диапазона 18000 я вижу результат 12000,33 6000,17 - person MBo; 04.08.2017
comment
Обратите внимание, что по умолчанию (когда ширина каждого столбца равна 1) центр каждого столбца находится в точке (i+ 0.5) для i = 1,2,.... Поэтому 12.17 должно быть правильным. Смотрите мой код. - person Martin Schmelzer; 04.08.2017
comment
@Martin Schmelzer Это предмет соглашения. Мы можем рассматривать бары с центром в значении i или с левым краем в i. - person MBo; 04.08.2017
comment
Без сомнения, да, но поскольку он использует R и использует аргументы по умолчанию для гистограммы, это 12,17 .... - person Martin Schmelzer; 04.08.2017
comment
Да, вы оба правы: seq(0,18,length.out=180000) дает 120000,2 и 6,000017. - person MisterH; 05.08.2017