#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
кода. Вы все равно можете передать многие из тех же параметров. Мы просто рисуем пользовательскую ось сбоку.