Основание гистограммы ошибок R

Я новичок в R. Для задания мне нужно создать сгруппированную гистограмму с полосами ошибок в базе R (поэтому пакеты не разрешены), с решеткой и с ggplot2. Для базового графика R я собрал некоторые данные и попытался создать простую гистограмму, подобную этой:

San_Diego <- c(65,20,74)
Rosarito <- c(34,35,23)
La_Paz <- c(21,71,28)
Mating_strategy <- c("Ultradominant","Dominant","Sneaker")
col <- c("darkorange1","skyblue3","gold2")        

lizards <- data.frame(row.names=Mating_strategy, San_Diego, 
                  Rosarito, La_Paz)
lizards.matrix <- as.matrix(lizards)

barplot(lizards.matrix,
        beside=T,
        col=col,
        ylim=c(0,80),
        xlab="Site",ylab="Frequency",
        legend.text=row.names(lizards.matrix),
        args.legend=list(x="top",bty="n"),
        las=1,
        cex.axis=1.2)

Но теперь я застрял, пытаясь добавить в свою диаграмму планки ошибок. Я попытался сделать это, как описано здесь (http://sickel.net/blogg/?p=1284), но я действительно не понимаю, что они делают, и когда я попробовал это, получился совершенно другой, непригодный для использования график. Я также нашел это решение (http://imgur.com/126hJSI) в Интернете, но я не понимаю, где я Я должен получить эти значения ucl и lcl для моих данных, так что это тоже не сработало.

Боюсь, мне нужно многому научиться, но я надеюсь, что кто-то здесь может мне немного помочь.

Заранее спасибо,

Марли


person Community    schedule 27.12.2015    source источник
comment
верхний и нижний пределы достоверности (ucl, lcl) поступают из ваших данных с использованием другой функции, например quantile или sd или чего-то еще   -  person rawr    schedule 27.12.2015


Ответы (1)


После http://sickel.net/blogg/?p=1284 я добавил ошибку столбцов к диаграмме столбцов следующим образом.

Сначала я запускаю код, который определяет пример данных (то есть все до строки, определяющей lizard.matrix. После этого график можно создать с помощью следующего кода:

# create bar plot
bp <- barplot(lizards.matrix,
              beside=T,
              col=col,
              ylim=c(0,100),
              xlab="Site",ylab="Frequency",
              legend.text=row.names(lizards.matrix),
              args.legend=list(x="top",bty="n"),
              las=1,
              cex.axis=1.2)

# create matrix of errors
lizards.error = matrix(c(10, 5, 12, 10, 8, 6, 12, 28, 3), ncol = 3)

# add vertical part of error bars
segments(bp, lizards.matrix - lizards.error, bp, lizards.matrix + lizards.error)

# horizontal parts of error bars
ew <- (bp[2,1]-bp[1,1])/4
segments(bp - ew, lizards.matrix - lizards.error, bp + ew, lizards.matrix - lizards.error)
segments(bp - ew, lizards.matrix + lizards.error, bp + ew, lizards.matrix + lizards.error)

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

Код работает следующим образом:

  • Я пользуюсь тем фактом, что barplot() возвращает матрицу, содержащую горизонтальные координаты полос. Поэтому я сохраняю вывод barplot() в переменной bp для дальнейшего использования. Также обратите внимание, что я изменил диапазон для ylim(), чтобы убедиться, что на графике достаточно места для полос ошибок.

  • Затем я определяю lizards.error, который содержит ошибку для каждого столбца на графике. Его структура повторяет структуру lizards.matrix. Итак, lizards.error[1, 1] содержит ошибку для бара с высотой `lizards.matrix [1, 1].

  • Затем с помощью функции segments() строятся планки погрешностей. Как и многие функции построения графиков в базе R, эта функция добавляет что-то к существующему графику. Его четыре соответствующих аргумента - это x0 y0, x1, y1, которые определяют линейные сегменты, которые соединяют пары точек, определенные (x0, y0) и (x1, y1). Если эти аргументы являются векторами, каждый компонент векторов определяет пару точек, так что линейные сегменты соединяют точки (x0[i], y0[i]) и (x1[i], y1[i]) для всех i.

  • segments() теперь используется для определения каждого из трех сегментов, составляющих полосу ошибок. Во-первых, вертикальная часть, где горизонтальная координата такая же, как и для планок погрешностей, так что для этого можно использовать bp. Вертикальные координаты рассчитываются исходя из высоты полосы (lizards.matrix) и размера ошибки (lizards.error).

  • Две горизонтальные линии планок погрешностей построены аналогично. Здесь также необходимо определить ширину линий, которая рассчитывается исходя из расстояния между соседними полосами. Горизонтальные координаты полос сохраняются в bp, и, таким образом, расстояние между полосами (или, что то же самое, ширина полос) может быть вычислено из разницы между двумя соседними координатами: bp[2,1]-bp[1,1]. (bp - это матрица, а [i, j] получает элемент матрицы в i -й строке и j -м столбце.)

РЕДАКТИРОВАТЬ: Как указывает rawr, аналогичный результат можно получить, используя один вызов arrows() вместо трех вызовов segments():

arrows(bp, lizards.matrix - lizards.error, bp, lizards.matrix + lizards.error,
       code = 3, angle = 90, length = 0.15)

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

  • Диапазон, охватываемый вертикальной линией, указан точно так же, как для segments().
  • code = 3 указывает функции рисовать стрелки на обоих концах линии.
  • angle - угол между стержнем стрелки и линиями, образующими наконечник стрелки. Угол 90 градусов приводит к горизонтальной линии.

Это решение, очевидно, проще, поскольку оно заменяет три вызова функций одним. Единственный недостаток, который я вижу, заключается в том, что ширина полос ошибок (аргумент length) задается в дюймах, поэтому она может измениться при изменении размера, в котором отображается график. В случае segments() ширина полос погрешностей дается в единицах горизонтальных координат.

person Stibu    schedule 27.12.2015
comment
вам нужно просто заменить все эти сегменты на arrows(bp, lizards.matrix - lizards.error, bp, lizards.matrix + lizards.error, code = 3, angle = 90) - person rawr; 27.12.2015
comment
Привет! Большое спасибо за ответ! Работает отлично. Я все еще пытаюсь понять некоторые вещи, которые вы сделали, чтобы лучше понять это. Прежде всего, мне интересно, откуда у вас значения для матрицы lizards.error? А во-вторых, я не понимаю этой части; ew ‹- (bp [2,1] -bp [1,1]) / 4. Я предполагаю, что вы определяете четверть ширины одной полосы, но где именно ссылки [2,1] и [1,1]? Также @rawr; это тоже сработало! но, на мой взгляд, это выглядит немного красивее, чем описал Стибу. - person ; 27.12.2015
comment
Значения для lizards.error составлены, поскольку в данных вашего примера нет ничего, что можно было бы использовать для их расчета. ew действительно установлен на четверть ширины одной полосы. bp - это матрица, содержащая горизонтальные координаты каждой полосы, поэтому я могу получить ширину полосы, взяв разницу между координатами двух соседних полос. bp - это матрица, поэтому мне нужно два индекса для извлечения одного элемента. - person Stibu; 27.12.2015