Я хотел бы сделать столбчатую диаграмму для столбца с разноцветными полосами, используя ggplot.
library(ggplot2)
set.seed(123)
df_a <- data.frame(A1 = sample(c(0, 1, 2, 3, 4), 10, replace = TRUE))
ggplot(df_a, aes(A1)) +
geom_bar(fill = c("green", "blue", "red", "yellow", "black")) +
scale_x_discrete(drop = FALSE)
Это прекрасно работает: Однако в таком небольшом примере Я не могу ожидать, что все возможные числа присутствуют. Вот пример, где это имеет место:
set.seed(321)
df_a <- data.frame(A1 = sample(c(0, 1, 2, 3, 4), 10, replace = TRUE))
Использование ggplot до ...
ggplot(df_a, aes(A1)) +
geom_bar(fill = c("green", "blue", "red", "yellow", "black")) +
scale_x_discrete(drop = FALSE)
... выдает ошибку:
Error: Aesthetics must be either length 1 or the same as the data (3): fill
Похоже, что ожидается вектор с ровно 3 цветами, поскольку есть 3 бара для заполнения?
Почему это так?
Есть ли способ заполнения без проверки чисел первый?
И форсирование заранее определенного количества баров (даже если оно пустое)?
Редактировать:
Решение было предложено AndS.
set.seed(321)
df_a <- data.frame(A1 = sample(c(0, 1, 2, 3, 4), 10, replace = TRUE))
ggplot(df_a, aes(A1)) +
geom_bar(aes(fill = as.factor(A1))) +
scale_x_discrete(drop = FALSE)
В этом случае это приведет к 4 барам (включая 1 пустой столбец).
Однако, чтобы получить все 5 столбцов (включая отсутствующие столбцы), необходимо пометить данные:
set.seed(321)
df_a <- data.frame(A1 = sample(c(0, 1, 2, 3, 4), 10, replace = TRUE))
df_a[[1]] <- ordered(df_a[[1]], levels = c(0:4), labels = c(0, 1, 2, 3, 4))
ggplot(df_a, aes(A1)) +
geom_bar(aes(fill = as.factor(A1))) +
scale_x_discrete(drop = FALSE)
Есть ли способ избежать этого? Например, включить параметры выборки, чтобы получить количество возможных столбцов?
Количество необходимых баров:
c_a <- c(0, 1, 2, 3, 4)
df_a <- data.frame(A1 = sample(c_a, 10, replace = TRUE))
length(c_a)
edit2: Я нашел решение, которое работает для меня:
set.seed(321)
c_a <- c(0, 1, 2, 3, 4)
df_a <- data.frame(A1 = sample(c_a, 10, replace = TRUE))
df_a[[1]] <- ordered(df_a[[1]], levels = c_a, labels = as.character(c_a))
ggplot(df_a, aes(A1)) +
geom_bar(aes(fill = as.factor(A1))) +
scale_x_discrete(drop = FALSE)