Кто-нибудь знает способ создания диаграммы в R с линией (или другим символом) в значении, соответствующем среднему значению?
Спасибо!
Кто-нибудь знает способ создания диаграммы в R с линией (или другим символом) в значении, соответствующем среднему значению?
Спасибо!
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)
.
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)
Проверьте chart.Boxplot из пакета PerformanceAnalytics
. Он позволяет определить символ, который будет использоваться для среднего значения распределения.
По умолчанию команда chart.Boxplot(data)
добавляет среднее значение в виде красного круга и медиану в виде черной линии.
Вот вывод с примерами данных; MWE:
#install.packages(PerformanceAnalytics)
library(PerformanceAnalytics)
chart.Boxplot(cars$speed)
Основываясь на ответах @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)
(Подробнее см. этот пост)
Если вы хотите добавить точки к горизонтальным блочным графикам, см. эту публикацию.
Я также думаю, что 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)
Вы можете попробовать изменить средний.символ и удалить или изменить медианный.символ. Надеюсь, это помогло. :)