У меня есть 10 групп точек данных, и я пытаюсь добавить среднее значение для каждой группы, которая будет отображаться на графике (например, другим символом, таким как большой треугольник, звезда или что-то подобное). Вот воспроизводимый пример
library(ggplot2)
library(reshape2)
set.seed(1234)
x <- matrix(rnorm(100),10,10)
varnames <- paste("var", seq(1,10))
df <- data.frame(x)
colnames(df) <- varnames
melt(df)
ggplot(data = melt(df)) + geom_point(mapping = aes(x = variable, y = value))
mymeans <- colMeans(df)
В принципе, теперь я хочу, чтобы значения в mymeans были нанесены на график в их соответствующем местоположении переменной. Кто-нибудь знает, как это быстро сделать?





Вы можете передать другой geom_point с другим data.frame:
Попробуйте следующее:
df_means <- melt(summarise_all(df, mean))
ggplot(data = melt(df)) +
geom_point(mapping = aes(x = variable, y = value)) +
geom_point(data=df_means, mapping=aes(x = variable, y = value), col = "red")
Я штат что ты искал?
Кстати, более компактный / современный / аккуратный способ:
library(tidyverse)
set.seed(1234)
df <- replicate(10, rnorm(10)) %>% as_data_frame() %>% gather()
df_means <- df %>% group_by(key) %>% summarise(value=mean(value))
ggplot(data = df) +
aes(x = key, y = value) +
geom_point() +
geom_point(data=df_means, col = "red")
Или мы можем использовать stat_summary
ggplot(data = reshape2::melt(df), aes(x = variable, y = value)) +
geom_point() +
stat_summary(
geom = "point",
fun.y = "mean",
col = "black",
size = 3,
shape = 24,
fill = "red"
)
Обзор возможных форм можно найти здесь: www.cookbook-r.com
Вместо того, чтобы использовать два разных фрейма, я считаю, что часто проще собрать все данные вместе.
library(ggplot2)
library(tidyr)
library(dplyr)
set.seed(1234)
x <- matrix(rnorm(100),10,10)
varnames <- paste("var", seq(1,10))
df <- data.frame(x)
colnames(df) <- varnames
melt_data = df %>% gather
mymeans = melt_data %>% group_by(key) %>% summarize(value = mean(value))
mymeans$type = 'mean'
melt_data$type = 'points'
ggplot(data = bind_rows(melt_data, mymeans)) +
geom_point(mapping = aes(x = key, y = value, color=type))
@tjebo: 1) Почему? Вы должны знать, что полученный data.frame предназначен только для построения графика, и знать, что он содержит. Помнить о подобных вещах довольно просто в программировании.
Обновлен код, чтобы отразить изменения в тидиверс из предыдущих комментариев.
Поскольку tidyverse обновил свой синтаксис, ниже представлены обновленные версии для dplyr и ggplot2. Спасибо, @Vincent Bonhomme и @markus.
Для воспроизводимости скопирую их примеры.
library(tidyverse)
# Dataset Generation
set.seed(1234)
df <- replicate(10, rnorm(10)) %>%
as_data_frame() %>%
pivot_longer(cols = everything(), names_to = "variable", values_to = "value") %>% # ** Change here
mutate(group = as.factor(rep(1:5, 20)))
#Option 1: Use stat_summary() for a cleaner version (@Vincent Bonhomme)
ggplot(df, aes(x = variable, y = value)) +
geom_point() +
stat_summary(
fun = "mean", #argument updated in new version.
geom = "point",
col = "black",
size = 3,
shape = 24,
fill = "red"
) +
ggtitle("Example")
#Option 2 -- Creating a means dataset (@ markus)
df_means <- df %>% group_by(variable) %>% summarise(value=mean(value))
ggplot(data = df) +
aes(x = variable, y = value) +
geom_point() +
geom_point(data=df_means,
col = "red",
size = 3,
shape = 24,
fill = "red") +
ggtitle("Example")
Оба создают один и тот же график
Вот используемые версии
dplyr * 1.0.3
ggplot2 * 3.3.3
это хорошо, вот только вы запутали пользователей: D
1) Я считаю предложение объединить данные с собственными агрегированными данными довольно опасной практикой. 2) этот ответ фактически точно воспроизводит ответ пользователя Винсента Бономмеса stackoverflow.com/a/52217979/7941188, просто добавляя еще несколько строк кода.