ggplot2 альтернативы для заполнения барплотов, вхождение фактора в несколько строк - PullRequest
0 голосов
/ 30 мая 2019

Я довольно новичок в R, и у меня есть проблема с построением графиков из моих данных, которые выглядят так:

condition answer
2    H
1    H
8    H
5    W
4    M
7    H
9    H
10   H
6    H
3    W

Данные состоят из 100 строк с условиями от 1 до 10,каждый случайным образом генерируется 10 раз (10 раз условие 1, 10 раз условие 8, ...).Каждое из условий также имеет ответ, который может быть H для Hit, M для Miss или W для неправильного.

Я хочу нанести на график количество попаданий для каждого условия на графике (например, 8 попаданий из10 для условия 1, ...) для этого я попытался сделать следующее в ggplot2

ggplot(data=test, aes(x=test$condition, fill=answer=="H"))+
  geom_bar()+labs(x="Conditions", y="Hitrate")+
  coord_cartesian(xlim = c(1:10), ylim = c(0:10))+ 
  scale_x_continuous(breaks=seq(1,10,1))

И это выглядело так:

Этона самом деле именно то, что мне нужно, за исключением красного цвета, который охватывает все.Вы можете видеть, что условия с 3 по 5 не имеют синей полосы, потому что для этих условий нет попаданий.

Есть ли способ избавиться от этого красного цвета и, возможно, подсчитать количество попаданий для различныхусловия?-> Я попробовал функцию подсчета dplyr, но она показала мне только количество H, когда где-то для этого конкретного условия.3-5, где просто «игнорируется» подсчетом, в выводе не было даже 0 .-> но мне все равно нужны эти цифры для сюжета

Извините за этот длинный постно я действительно в конце знания, учитывая это.Я был бы открыт для предложений или альтернатив!Заранее спасибо!

Ответы [ 3 ]

0 голосов
/ 30 мая 2019

Другой вариант - явно выбрать цвета заливки и сделать FALSE прозрачным, используя scale_fill_manual.Так как ЛОЖЬ идет первым по алфавиту, первое значение, которое нужно указать, - ЛОЖЬ, второе ИСТИНА.

ggplot(data=test, aes(x=condition, fill=answer=="H"))+
  geom_bar()+labs(x="Conditions", y="Hitrate")+
  coord_cartesian(xlim = c(1:10), ylim = c(0:10))+ 
  scale_x_continuous(breaks=seq(1,10,1)) +
  scale_fill_manual(values = c(alpha("red", 0), "cadetblue")) +
  guides(fill = F)

enter image description here

0 голосов
/ 30 мая 2019

Это ситуация, когда небольшая предварительная обработка проходит долгий путь.Я сделал пример данных, которые воссоздали бы проблему, то есть есть случаи, когда не будет никаких «H».

Вместо того чтобы полагаться на ggplot для агрегирования данных так, как вы этого хотите, используйте соответствующие инструменты.Поскольку вы упоминаете dplyr::count, я использую dplyr функции.

Задача предварительной обработки состоит в подсчете наблюдений с ответом "H", включая случаи, когда счет равен 0. Чтобы убедиться, что все комбинации сохранены, выполните преобразованиеусловие для фактора и установите .drop = F в count, который, в свою очередь, передается в group_by.

library(dplyr)
library(ggplot2)

set.seed(529)
test <- data.frame(condition = rep(1:10, times = 10),
                   answer = c(sample(c("H", "M", "W"), 50, replace = T),
                              sample(c("M", "W"), 50, replace = T)))

hit_counts <- test %>%
  mutate(condition = as.factor(condition)) %>%
  filter(answer == "H") %>%
  count(condition, .drop = F)

hit_counts
#> # A tibble: 10 x 2
#>    condition     n
#>    <fct>     <int>
#>  1 1             0
#>  2 2             1
#>  3 3             4
#>  4 4             2
#>  5 5             3
#>  6 6             0
#>  7 7             3
#>  8 8             2
#>  9 9             1
#> 10 10            1

Тогда просто построите это.geom_col - это версия geom_bar, для которой у вас уже есть ваши значения y, вместо того, чтобы ggplot подсчитывать их для вас.

ggplot(hit_counts, aes(x = condition, y = n)) +
  geom_col()

0 голосов
/ 30 мая 2019

Один из вариантов - просто отфильтровать что-нибудь, кроме, где answer == "H" из вашего набора данных, и затем построить график.

Альтернативой является использование сгруппированного гистограммы, сделанного установкой position = "dodge":

test <- data.frame(condition = rep(1:10, each = 10),
                   answer = sample(c('H', 'M', 'W'), 100, replace = T))

ggplot(data=test) +
    geom_bar(aes(x = condition, fill = answer), position = "dodge") +
    labs(x="Conditions", y="Hitrate") +
    coord_cartesian(xlim = c(1:10), ylim = c(0:10)) + 
    scale_x_continuous(breaks=seq(1,10,1))

grouped barplot

Также обратите внимание, что если условие на самом деле является категориальной переменной, может быть лучше сделать его фактором:

test$condition <- as.factor(test$condition)

Это означает, что вам не нужен вызов scale_x_continuous, и что линии сетки будут чище.

...