ggplot2: среднее значение и медиана в geom_violin - PullRequest
0 голосов
/ 24 января 2019

Я строил график для скрипки, а также средние и средние значения следующим образом:

test <- read.csv2("http://www.reduts.net/test.csv", sep=",")

ggplot(data = test, aes(y = var, x = as.factor(grp))) +
  geom_violin() +
  stat_summary(fun.y = mean, geom = "point", shape = 23, size = 2)+
  stat_summary(fun.y = median, geom = "point", size = 2, color = "red")+
  xlab("Group") +
  ylab("EUR") +
  scale_y_continuous(limits = c(0,1000), breaks = seq(0,1000,200))+
  ggsave("image.jpg", dpi = 300, units = 'cm', height = 10, width = 22)

library(psych)
describe(test$var)

Теперь моя проблема заключается в том, что все групповые средние значения, показанные на изображении, намного ниже среднего значения, которое я получаю, когдаиспользуя psych::describe() по всем группам.

Возможно ли, что средние значения и медианы, рассчитанные для каждой группы, не включают выбросы в каждой группе (только значения в пределах усов)?И если да, то как я могу построить «реальные» медианы / средние значения для всех точек данных?

1 Ответ

0 голосов
/ 24 января 2019

Использование scale_y_continuous(limits=) фильтрует базовые данные, поэтому среднее значение / медиана в stat_summary относятся к предварительно отфильтрованным данным.

Чтобы просто увеличить масштаб без изменения базовых данных, используйте coord_cartesian

например

+ coord_cartesian(ylim=c(0, 1000))

Вот воспроизводимый пример :

library(ggplot2)
p <- ggplot(iris, aes(x=Species, y=Sepal.Length)) + geom_point() +
    stat_summary(fun.y='mean', geom='point', size=2, col='red')
p
# mean(subset(iris, Species == 'setosa')$Sepal.Length) # 5.006

Обратите внимание, что средняя длина Sepal для setosa составляет около 5. Теперьдавайте ограничим ось Y.

p + scale_y_continuous(lim=c(5, 8), minor_breaks=seq(5, 8, by=0.1))
Warning messages:
1: Removed 22 rows containing non-finite values (stat_summary). 
2: Removed 22 rows containing missing values (geom_point).

Обратите внимание на предупреждающие сообщения и увидим, что на полученном графике средняя длина Sepal для setosa теперь немного больше 5,2.Чтобы подтвердить, что scale_y_continuous действительно фильтрует данные перед вычислением stat_summary,

mean(subset(iris, Species == 'setosa' & Sepal.Length >= 5)$Sepal.Length)
# 5.23

, тогда как, если я просто сделаю

p + coord_cartesian(ylim=c(5, 8))

, средства будут такими же, как на оригинале.данные.(Вы все еще можете использовать scale_y_continuous для перерывов, только не используйте ограничения).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...