В R, как построить 5x3 барплотов из таблицы ax, y, z? - PullRequest
0 голосов
/ 03 мая 2020

У меня есть топор по y по z (см. Изображение ниже). Я хочу создать 15 столбчатых графиков в одном выходе, расположенном как 5 максимумов и 3 поперек. Для каждой гистограммы я хочу, чтобы ось x была метками "Caught", "Deterred" и "Successful", а ось y - частотой "Caught", "Deterred" и "Successful". Я бы хотел, чтобы 5 столбчатых графиков (не знаю, как сказать это более четко извините) представляли бы метку «Порог», то есть 20, 40, 60, 80 или 90. Мне бы хотелось, чтобы 3 столбчатых столбца поперек (снова не уверен, как правильно это сказать, так что прости меня) представлять ярлык «Модель», т.е. либо Model_1, Model_2 или Model_3. Таким образом, например, столбчатая диаграмма в строке 1 столбца 1 (из столбчатых диаграмм 5x3) должна иметь частоты "Пойманный", "Отложенный", "Успешный", когда у меня Model_1 и порог 20. 20. 1001 *

The table I have

Извиняюсь за плохое объяснение. Пожалуйста, дайте мне знать, если что-то нужно уточнить. Спасибо!

1 Ответ

1 голос
/ 03 мая 2020

Вот опция ggplot2, которая делает ваши "5 высоких, 3 широких" простыми с facet ing:

Во-первых, поддельные данные:

set.seed(42)
n <- 500
Models <- table(
  Threshold = sample(c(20, 40, 60, 80, 90), size = n, replace = TRUE),
  Outcome = sample(c("Caught", "Deferred", "Successful"), size = n, replace = TRUE),
  Model = sample(c("Model_1", "Model_2", "Model_3"), size = n, replace = TRUE)
)
Models
# , , Model = Model_1
#          Outcome
# Threshold Caught Deferred Successful
#        20     14       15         14
#        40      7       10         15
#        60     16       13         12
#        80      7       11          4
#        90     16       10         10
# , , Model = Model_2
#          Outcome
# Threshold Caught Deferred Successful
#        20     14       11         15
#        40      5       12         10
#        60     11        8         13
#        80      7       15          6
#        90     12       13         11
# , , Model = Model_3
#          Outcome
# Threshold Caught Deferred Successful
#        20     14        7         10
#        40     14       13          9
#        60      6       12         13
#        80     20        4         12
#        90     10        8         11

Одна хорошая вещь о что-то, созданное с помощью table, заключается в том, что as.data.frame дает нам что-то простое для работы с предпочтением ggplot2 "длинные данные":

head(as.data.frame(Models))
#   Threshold  Outcome   Model Freq
# 1        20   Caught Model_1   14
# 2        40   Caught Model_1    7
# 3        60   Caught Model_1   16
# 4        80   Caught Model_1    7
# 5        90   Caught Model_1   16
# 6        20 Deferred Model_1   15

Сюжет:

library(ggplot2)
ggplot(as.data.frame(Models), aes(Outcome, Freq)) +
  geom_bar(stat = "identity") +
  facet_grid(Threshold ~ Model)

ggplot2 faceted barplot


Примечание: если ваши данные, естественно, array, а не table, мы можем легко учесть, что: as.table(ary) преобразует из array в table (что на самом деле является просто массивом внизу):

set.seed(42)
ary <- array(sample(20, size=2*3*3, replace=TRUE), dim = c(2,3,3))
dimnames(ary) <- list(Threshold=c(20,40), Outcome=c("C","D","S"), Model=1:3)

ary
# , , Model = 1
#          Outcome
# Threshold  C  D  S
#        20 19  6 13
#        40 19 17 11
# , , Model = 2
#          Outcome
# Threshold  C  D  S
#        20 15 14 10
#        40  3 15 15
# , , Model = 3
#          Outcome
# Threshold  C  D  S
#        20 19 10 20
#        40  6 19  3

as.table(ary)
### same output as `ary`

head(as.data.frame(as.table(ary)))
#   Threshold Outcome Model Freq
# 1        20       C     1   19
# 2        40       C     1   19
# 3        20       D     1    6
# 4        40       D     1   17
# 5        20       S     1   13
# 6        40       S     1   11
...