Добавление нормальной кривой в ggplot категориальных данных - PullRequest
0 голосов
/ 22 февраля 2019

Меня попросили создать график, который визуализирует оценки людей по определенному тесту, который имеет среднее значение 100 и стандартное отклонение от 15.

Приведенный ниже код создает график на основе того, как он был запрошен.быть визуализированным.Я намеренно прокомментировал линии, которые фактически добавляют оценки и доверительные интервалы этих оценок, поскольку требовалось наложить нормальную кривую, имеющую пиковое среднее значение, независимо от оценок, количества оценок или пределов графика.Пик нормы должен всегда достигать вершины графика, поэтому в этом случае вершина балла 4 и хвосты нормальной кривой должны находиться на границах графика, которые в этом случае составляют 60 и 140 (номожет быть что угодно, например 40 и 160).

library(ggplot2)

data <- data.frame(name = c("Score 1", "Score 2", "Score 3", "Score 4"),
                   value = c(89,110,116,76),
                   sem = c(1.1,0.86,1.6,1.3),
                   categories = c("mh","cog","mh","cog"))

z <- 1.96

# plot the main data
p <- ggplot(data, aes(x = name, y = value, ymin = value - (sem * z), ymax = value + (sem * z)))

# Add ranges
p <- p + coord_flip() +
  geom_rect(xmin = -Inf, xmax = Inf, ymin = 90, ymax = 110, alpha = 0.5, fill = "grey50") +
  geom_rect(xmin = -Inf, xmax = Inf, ymin = 85, ymax = 90, alpha = 0.5, fill = "grey70") +
  geom_rect(xmin = -Inf, xmax = Inf, ymin = 110, ymax = 115, alpha = 0.5, fill = "grey70") +
  geom_hline(yintercept = 100) +
  geom_hline(yintercept = 90) +
  geom_hline(yintercept = 110) +
  geom_hline(yintercept = 85) +
  geom_hline(yintercept = 115) +
  labs(title = "", x = "Test", y = "Score") +
  theme(plot.title = element_text(size = 16, face = "bold"),
        axis.text = element_text(size = 12),
        axis.title = element_text(size = 14, face = "bold"))

# Place the breaks and limits on the plot
p <- p + scale_y_continuous(breaks = c(60,70,80,90,100,110,120,130,140), limits = c(60,140), expand = c(0,0))

# normal curve overlay here
# ?????

# Add representation of score and confidence interval
# p <- p + geom_point(aes(colour = categories)) +
#     geom_errorbar(aes(colour = categories),  width = .5)

# Add data labels to plot
# p <- p + geom_text(aes(label = value), size = 2) +
#   geom_text(aes(label = round(value - (sem * z), digits = 0), y = value - (sem * z)), size = 2, hjust = 1.25) +
#   geom_text(aes(label = round(value + (sem * z), digits = 0), y = value + (sem * z)), size = 2, hjust = -0.25)

# print the plot
p

Я рассматривал такие решения, как this или:

plot(x,y, type = "l", lwd = 2, xlim = c(-3.5,3.5))

или:

p + stat_function(fun = dnorm, color="red", args=list(mean=100, sd=15))

но у меня проблемы с интеграцией их в остальную часть кода.

Существует целый ряд других манипуляций с эстетикой, но я не думаю, что они имеют отношение к этому примеру.

...