Вот мой код. Набор данных создается искусственно для имитации данных, аналогичных моей реальной проблеме.
Код:
library(ggplot2)
DataSet1 <- data.frame("Cat" = rep("A",10000), "Bin" = rep(c(-49:50),100),
"Value" = c(seq(0,4.9, by=0.1),
seq(4.9,0, by=-0.1)) * rep(rnorm(100,50,1),100))
DataSet2 <- data.frame("Cat" = rep("B",10000), "Bin" = rep(c(-49:50),100),
"Value" = c(seq(0,4.9, by=0.1),
seq(4.9,0, by=-0.1)) * rep(rnorm(100,75,1),100))
DataSet3 <- data.frame("Cat" = rep("C",10000), "Bin" = rep(c(-49:50),100),
"Value" = c(seq(0,4.9, by=0.1),
seq(4.9,0, by=-0.1)) * rep(rnorm(100,100,1),100))
DataSet <- rbind(DataSet1, DataSet2, DataSet3)
d <- ggplot(data = DataSet, aes(Bin, Value, color = Cat))
d + stat_summary(fun.y = sum, geom = 'step', size = 1)
Мой результат:
Что я хочу сделать:
Нормализуйте каждый из этих графиков, то есть разделите сумму по ширине каждого интервала на общее значение для этой кривой.





Насколько мне известно, stat_summary не предназначен для одновременной работы со всеми значениями x и y, поэтому такой тип сводки по группам невозможно строго в пределах ggplot. В таких случаях, как этот, обычно лучше заранее рассчитать свое резюме, а затем построить его. Использование dplyr для упрощения суммирования:
library(dplyr)
DataSet <- DataSet %>%
group_by(Cat, Bin) %>%
summarize(Value = sum(Value)) %>%
group_by(Cat) %>%
mutate(Value = Value / sum(Value))
d <- ggplot(data = DataSet, aes(Bin, Value, color = Cat))
d + stat_summary(fun.y = mean, geom = 'step', size = 1)
В таком случае это будет выглядеть так: DataSet <- DataSet %>% group_by(Cat1, Cat2, Bin) %>% summarize(Value = sum(Value)) %>% group_by(Cat1, Cat2) %>% mutate(Value = Value / sum(Value)) d <- ggplot(data = DataSet, aes(Bin, Value, color = Cat1)) d + stat_summary(fun.y = mean, geom = 'step', size = 1) + facet_grid(Cat2~.) Кроме того, я очень признателен за вашу помощь. Я впервые прошу о помощи в сообществе R, и это здорово, насколько все могут помочь.
Большое спасибо! Это именно то, что я искал. Однако у меня есть пара вопросов: 1. Вы используете fun.y = mean, потому что есть только одно значение, верно? fun.y = среднее или сумма будет такой же? 2. Что делать, если у вас есть несколько столбцов cat, таких как cat1, cat2 и т. д., И вы хотите разделить цвет по cat1 и фасет по cat2?