Подтвердить что ты не робот

Способ всегда уклоняться от гистограммы?

Используя ggplot2, я создаю гистограмму с коэффициентом на горизонтальной оси и еще один фактор для цвета заливки, используя уклоненную позицию. Моя проблема заключается в том, что фактор заполнения иногда принимает только одно значение для значения горизонтального коэффициента, и ни с чем не уклоняться от полосы занимает всю ширину. Есть ли способ заставить его ничего не уклониться, чтобы все ширины бара были одинаковыми? Или, что то же самое, чтобы построить 0?

Например

ggplot(data = mtcars, aes(x = factor(carb), fill = factor(gear))) +
geom_histogram(position = "dodge")

enter image description here

Этот ответ содержит пару идей. Его также спросили, прежде чем новая версия была выпущена, так что, может быть, что-то изменилось? Использование граней (также показано здесь) Мне не нравится моя ситуация, хотя я полагаю, что редактирование данных и использование geom_bar могут работать, но это чувствует себя неэлегантно. Более того, когда я все-таки пробовал аранжировать

ggplot(mtcars, aes(x = factor(carb), fill = factor(gear))) +
    geom_bar() + facet_grid(~factor(carb))

Я получаю сообщение об ошибке "Ошибка в layout_base (данные, cols, drop = drop): По крайней мере один слой должен содержать все переменные, используемые для фацетирования"

Я полагаю, что я мог бы создать кадр данных из counts, а затем использовать geom_bar,

mtcounts <- ddply(subset(mtcars, select = c("carb", "gear")),
    .fun = count, .variables = c("carb", "gear"))

заполняя уровни, отсутствующие 0. Кто-нибудь знает, будет ли это работать или если есть лучший способ?

4b9b3361

Ответ 1

Обновлено geom_bar требуется stat = "identity"

Я не уверен, что это слишком поздно для вас, но см. ответ на недавний пост здесь То есть, я бы посоветовал Джорану предварительно рассчитать подсчеты за пределами вызова ggplot и использовать geom_bar. Как и в случае с ответом на другой пост, подсчеты получаются в два этапа: во-первых, с помощью dcast получается перекрестная пересылка счетчиков; затем второй, melt перекрестной перегородкой.

library(ggplot2)
library(reshape2)

dat = dcast(mtcars, factor(carb) ~ factor(gear), fun.aggregate = length)
dat.melt = melt(dat, id.vars = "factor(carb)", measure.vars = c("3", "4", "5"))
dat.melt

(p <- ggplot(dat.melt, aes(x = `factor(carb)`, y = value, fill = variable)) + 
  geom_bar(stat = "identity", position = "dodge"))

Диаграмма:

enter image description here