Блочная диаграмма в R, показывающая среднее значение

Кто-нибудь знает способ создания диаграммы в R с линией (или другим символом) в значении, соответствующем среднему значению?

Спасибо!


person Brani    schedule 22.03.2010    source источник


Ответы (5)


abline(h=mean(x))

для горизонтальной линии (используйте v вместо h для вертикальной, если вы ориентируете свой ящик горизонтально), или

points(mean(x))

за точку. Используйте параметр pch для изменения символа. Вы также можете покрасить их, чтобы улучшить видимость.

Обратите внимание, что они вызываются после того, как вы нарисовали коробочную диаграмму.

Если вы используете интерфейс формул, вам придется построить вектор средних значений. Например, взяв первый пример из ?boxplot:

boxplot(count ~ spray, data = InsectSprays, col = "lightgray")
means <- tapply(InsectSprays$count,InsectSprays$spray,mean)
points(means,col="red",pch=18)

Если ваши данные содержат пропущенные значения, вы можете заменить последний аргумент функции tapply на function(x) mean(x,na.rm=T).

person James    schedule 22.03.2010
comment
Не могли бы вы объяснить, как это можно сделать, например, в первом примере справки boxplot {graphics}? boxplot (количество ~ брызги, данные = InsectSprays, col = светло-серый) - person Brani; 22.03.2010
comment
Я добавил это в ответ в качестве примера сейчас - person James; 22.03.2010
comment
abline просто добавляет горизонтальную линию через весь график, а не только внутри блока диаграммы. Я не могу найти никакого решения для этого без использования ggplot2. Любой? - person FLonLon; 23.02.2021

С ggplot2:

p<-qplot(spray,count,data=InsectSprays,geom='boxplot')
p<-p+stat_summary(fun.y=mean,shape=1,col='red',geom='point')
print(p)
person Jyotirmoy Bhattacharya    schedule 24.03.2010

Проверьте chart.Boxplot из пакета PerformanceAnalytics. Он позволяет определить символ, который будет использоваться для среднего значения распределения.

По умолчанию команда chart.Boxplot(data) добавляет среднее значение в виде красного круга и медиану в виде черной линии.

Вот вывод с примерами данных; MWE:

#install.packages(PerformanceAnalytics)    
library(PerformanceAnalytics)
chart.Boxplot(cars$speed)

изображение диаграммы с использованием пакета аналитики производительности

person George Dontas    schedule 22.03.2010

Основываясь на ответах @James и @Jyotirmoy Bhattacharya, я придумал это решение:

zx <- replicate (5, rnorm(50))
zx_means <- (colMeans(zx, na.rm = TRUE))
boxplot(zx, horizontal = FALSE, outline = FALSE)
points(zx_means, pch = 22, col = "darkgrey", lwd = 7)

(Подробнее см. этот пост)

Если вы хотите добавить точки к горизонтальным блочным графикам, см. эту публикацию.

person kribys    schedule 01.04.2012

Я также думаю, что chart.Boxplot - лучший вариант, он дает вам положение среднего, но если у вас есть матрица с доходами, все, что вам нужно, это одна строка кода, чтобы получить все диаграммы на одном графике.

Вот небольшой пример портфеля ETF.

library(zoo)
library(PerformanceAnalytics)
library(tseries)
library(xts)

VTI.prices = get.hist.quote(instrument = "VTI", start= "2007-03-01", end="2013-03-01",
                        quote = c("AdjClose"),provider = "yahoo",origin ="1970-01-01", 
                        compression = "m", retclass = c("zoo"))

VEU.prices = get.hist.quote(instrument = "VEU", start= "2007-03-01", end="2013-03-01",
                        quote = c("AdjClose"),provider = "yahoo",origin ="1970-01-01", 
                        compression = "m", retclass = c("zoo"))

VWO.prices = get.hist.quote(instrument = "VWO", start= "2007-03-01", end="2013-03-01",
                        quote = c("AdjClose"),provider = "yahoo",origin ="1970-01-01", 
                        compression = "m", retclass = c("zoo"))


VNQ.prices = get.hist.quote(instrument = "VNQ", start= "2007-03-01", end="2013-03-01",
                       quote = c("AdjClose"),provider = "yahoo",origin ="1970-01-01", 
                       compression = "m", retclass = c("zoo"))

TLT.prices = get.hist.quote(instrument = "TLT", start= "2007-03-01", end="2013-03-01",
                        quote = c("AdjClose"),provider = "yahoo",origin ="1970-01-01", 
                        compression = "m", retclass = c("zoo"))

TIP.prices = get.hist.quote(instrument = "TIP", start= "2007-03-01", end="2013-03-01",
                         quote = c("AdjClose"),provider = "yahoo",origin ="1970-01-01", 
                         compression = "m", retclass = c("zoo"))

index(VTI.prices) = as.yearmon(index(VTI.prices))
index(VEU.prices) = as.yearmon(index(VEU.prices))
index(VWO.prices) = as.yearmon(index(VWO.prices))

index(VNQ.prices) = as.yearmon(index(VNQ.prices))
index(TLT.prices) = as.yearmon(index(TLT.prices))
index(TIP.prices) = as.yearmon(index(TIP.prices))

Prices.z=merge(VTI.prices, VEU.prices, VWO.prices, VNQ.prices, 
           TLT.prices, TIP.prices)

colnames(Prices.z) = c("VTI", "VEU", "VWO" , "VNQ", "TLT", "TIP")

returnscc.z = diff(log(Prices.z))

start(returnscc.z)
end(returnscc.z)
colnames(returnscc.z) 
head(returnscc.z)

Матрица возврата

ret.mat = coredata(returnscc.z)
class(ret.mat)
colnames(ret.mat)
head(ret.mat)

Коробчатый график матрицы доходности

chart.Boxplot(returnscc.z, names=T, horizontal=TRUE, colorset="darkgreen", as.Tufte =F,
          mean.symbol = 20, median.symbol="|", main="Return Distributions Comparison",
          element.color = "darkgray", outlier.symbol = 20, 
          xlab="Continuously Compounded Returns", sort.ascending=F)

Вы можете попробовать изменить средний.символ и удалить или изменить медианный.символ. Надеюсь, это помогло. :)

person marbel    schedule 08.04.2013