Гистограмма с отклонениями от ненулевого числа

#r #bar-chart

#r #гистограмма

Вопрос:

У меня есть измерения некоторой переменной. Все значения положительные. В гистограмме я хочу показать все измерения и отклонение всех измерений от общего среднего. Таким образом, некоторые бары повышаются от среднего, а некоторые снижаются. Чтобы получить такой график, я попытался использовать offset barplot функцию from, но это не сработало. Я нашел решение, но оно не идеально и подвержено ошибкам. Применение осей требует некоторой настройки чисел. Есть ли у кого-нибудь более элегантное решение для этого? Спасибо!

 (aaa    <-  c(1: 10))
(meanz  <-  mean(aaa))

(ccc    <-  aaa-meanz[1])

barplot(ccc, axes=FALSE, ylim=c(-5, 5))
(yvals      <-  c(-5, 0, 5))
(yvalscorr  <-  yvals meanz)
axis(side=2, at=yvals, labels=yvalscorr,    mgp=c(1,1,1),   outer=TRUE, lwd=2, las=1, cex.axis=1.0,   tck=0.02, hadj=0.5,  padj=0.5, pos=-0.2)
  

Это более или менее то, что я намереваюсь получить (хотя требуется больше гибкости при установке значений осей на 0)

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

Ответ №1:

Документированное, но тонкое свойство функции гистограммы заключается в том, что вы можете предоставить ей матрицу в качестве данных, и она будет складывать столбцы, столбцы 2-го ряда, начинающиеся там, где заканчивается 1-й. Вы также можете указать цвета и границы NA , которые означают, что они не отображаются. Таким образом, это означает, что если вы rbind приведете строку средних значений к значениям, которые хотите отобразить (с вычитанием среднего), но не построите 1-й набор столбцов, вы увидите то, что просите. например:

  aaa <- 1:10
 meanz <- mean(aaa)
 ccc <- aaa- meanz
 barplot( rbind( meanz, ccc ), col=c(NA,'grey'), border=c(NA,1)
  

Это дает график, очень похожий на ваш, единственное видимое отличие — ось y. Невидимая разница заключается в том, что система координат соответствует интересующим данным, что может упростить расширение графика.

Комментарии:

1. Это хорошо для значений, близких к нулю. Но как насчет aaa <- 99:110 . Возможно, вы также захотите установить ylim=range(aaa) .

2. @MrFlick, хорошая мысль. Я предполагал, что исходный плакат будет использовать это только со значениями, достаточно близкими к 0, которые будут включены. Настройка ylim будет работать, когда это не так.

Ответ №2:

Как насчет определения такой функции

 x <- cumsum(runif(10))
zero <- mean(x)

offsetbarplot <- function(x, zero=0, ..., yaxt="c", ylim) {
    xo <- x-zero
    yax <- pretty(x)
    if (missing(ylim)) 
        ylim<-range(yax-zero)
    else
        ylim<-ylim-zero
    barplot(xo, ..., yaxt=ifelse(yaxt=="c","n",yaxt), ylim=ylim)
    if(yaxt=="c") {
        axis(side=2, at=yax-zero, labels=yax)
    }
}

offsetbarplot(x, zero)
  

Таким образом, мы можем использовать как можно больше barplot кода. Вы все равно можете передать многие из тех же параметров. Мы просто рисуем пользовательскую ось сбоку.