Вопрос по r, ggplot2 – Не сбрасывайте ноль: уклоненный барплот

30

Я делаю уклоненный барплот в ggplot2, и у одной группировки есть нулевой счет, который я хочу отобразить. Я вспомнил, что видел это наВОТ Некоторое время назад и понял,scale_x_discrete(drop=F) должно сработать. Похоже, что он не работает с уклоненными барами. Как я могу сделать показ нулевых отсчетов?

Например, (код ниже) на графике ниже, type8 ~ group4 не имеет примеров. Я все еще хотел бы, чтобы график отображал пустое пространство для отсчета нуля вместо удаления бара. Как я могу это сделать?

enter image description here

mtcars2 <- data.frame(type=factor(mtcars$cyl), 
    group=factor(mtcars$gear))

m2 <- ggplot(mtcars2, aes(x=type , fill=group))
p2 <- m2 + geom_bar(colour="black", position="dodge") +
        scale_x_discrete(drop=F)
p2

Ваш Ответ

6   ответов
7

data.table, поскольку это более быстрое решение для гораздо больших наборов данных. Я включил примечания к данным, чтобы те, кто менее опытен и хотят понять, почему я сделал то, что я сделал, могут сделать это легко. Вот как я манипулировалmtcars набор данных:

library(data.table)
library(scales)
library(ggplot2)

mtcars <- data.table(mtcars)
mtcars$Cylinders <- as.factor(mtcars$cyl) # Creates new column with data from cyl called Cylinders as a factor. This allows ggplot2 to automatically use the name "Cylinders" and recognize that it's a factor
mtcars$Gears <- as.factor(mtcars$gear) # Just like above, but with gears to Gears
setkey(mtcars, Cylinders, Gears) # Set key for 2 different columns
mtcars <- mtcars[CJ(unique(Cylinders), unique(Gears)), .N, allow.cartesian = TRUE] # Uses CJ to create a completed list of all unique combinations of Cylinders and Gears. Then counts how many of each combination there are and reports it in a column called "N"

И вот вызов, который произвел график

ggplot(mtcars, aes(x=Cylinders, y = N, fill = Gears)) + 
               geom_bar(position="dodge", stat="identity") + 
               ylab("Count") + theme(legend.position="top") + 
               scale_x_discrete(drop = FALSE)

И это производит этот график:

Cylinder Graph

Кроме того, если есть непрерывные данные, как это вdiamonds набор данных (благодаря mnel):

library(data.table)
library(scales)
library(ggplot2)

diamonds <- data.table(diamonds) # I modified the diamonds data set in order to create gaps for illustrative purposes
setkey(diamonds, color, cut) 
diamonds[J("E",c("Fair","Good")), carat := 0]
diamonds[J("G",c("Premium","Good","Fair")), carat := 0]
diamonds[J("J",c("Very Good","Fair")), carat := 0]
diamonds <- diamonds[carat != 0]

Затем с помощьюCJ будет работать так же.

data <- data.table(diamonds)[,list(mean_carat = mean(carat)), keyby = c('cut', 'color')] # This step defines our data set as the combinations of cut and color that exist and their means. However, the problem with this is that it doesn't have all combinations possible
data <- data[CJ(unique(cut),unique(color))] # This functions exactly the same way as it did in the discrete example. It creates a complete list of all possible unique combinations of cut and color
ggplot(data, aes(color, mean_carat, fill=cut)) +
             geom_bar(stat = "identity", position = "dodge") + 
             ylab("Mean Carat") + xlab("Color")

Даем нам этот график:

Diamonds Fixed

9

таблиц.
Он не работал в моей версии CRAN (2.2.1), но в последней версии разработки ggplot (2.2.1.900) у меня не было проблем.

ggplot(mtcars, aes(factor(cyl), fill = factor(vs))) +
  geom_bar(position = position_dodge(preserve = "single"))

http://ggplot2.tidyverse.org/reference/position_dodge.html

0

table() функция, которая вычисляет количество вхождений фактора дляall его уровни

# load plyr package to use ddply
library(plyr) 

# compute the counts using ddply, including zero occurrences for some factor levels
df <- ddply(mtcars2, .(group), summarise, 
 types = as.numeric(names(table(type))), 
 counts = as.numeric(table(type)))

# plot the results
ggplot(df, aes(x = types, y = counts, fill = group)) +
 geom_bar(stat='identity',colour="black", position="dodge")

3

count а такжеcomplete отdplyr сделать это.

library(tidyverse)

mtcars %>% 
    mutate(
        type = as.factor(cyl),
        group = as.factor(gear)
    ) %>%
    co,unt(type, group) %>% 
    complete(type, group, fill = list(n = 0)) %>%
    ggplot(aes(x = type, y = n, fill = group)) +
        geom_bar(colour = "black", position = "dodge", stat = "identity")
Очень хорошо ... Я подозреваю, что следующий выпуск ggplot2 для CRAN будет содержать ответ @ S_BRT, который выглядит как самое лучшее решениеgithub.com/tidyverse/ggplot2/blob/master/R/position-dodge.r Tyler Rinker
15

Updated geom_bar() потребностиstat = "identity"

Для чего это стоит: Таблица подсчетов, dat, выше, содержит NA. Иногда полезно иметь явный 0 вместо этого; например, если следующий шаг - поставить счетчики над столбцами. Следующий код делает именно это, хотя он, вероятно, не проще, чем Joran. Он включает в себя два этапа: получить кросс-таблицу с использованиемdcastзатем расплавить столmelt, с последующимggplot() по-прежнему.

library(ggplot2)
library(reshape2)
mtcars2 = data.frame(type=factor(mtcars$cyl), group=factor(mtcars$gear))

dat = dcast(mtcars2, type ~ group, fun.aggregate = length)
dat.melt = melt(dat, id.vars = "type", measure.vars = c("3", "4", "5"))
dat.melt

ggplot(dat.melt, aes(x = type,y = value, fill = variable)) + 
  geom_bar(stat = "identity", colour = "black", position = position_dodge(width = .8), width = 0.7) +
  ylim(0, 14) +
  geom_text(aes(label = value), position = position_dodge(width = .8), vjust = -0.5)

enter image description here

Это оказалось немного приятнее. Я уже закончил графику, и это заняло немного хакера, но это решило эти проблемы. Хороший ответ. +1 Tyler Rinker
12

которым я знаю, - это предварительно рассчитать количество и добавить фиктивную строку:

dat <- rbind(ddply(mtcars2,.(type,group),summarise,count = length(group)),c(8,4,NA))

ggplot(dat,aes(x = type,y = count,fill = group)) + 
    geom_bar(colour = "black",position = "dodge",stat = "identity")

enter image description here

Я думал, что с помощьюstat_bin(drop = FALSE,geom = "bar",...) вместо этого будет работать, но, видимо, это не так.

@TylerRinker Честно говоря, я чувствую, чтоstat_bin(drop = FALSE, geom = "bar",position = "dodge",...) should сделай это; по крайней мере, документация настоятельно предполагает, что это будет. Мне было бы очень любопытно услышать от более осведомленных людей из списка рассылки, почему это не так.
Я сейчас работаю над проектом, но позже добавлю его в список и сообщу здесь. Tyler Rinker
Не так просто, как я надеялся, но не смог найти подходящий ответ в моем поиске, поэтому я подумал, что это потребует некоторой переделки. Спасибо, Джоран. Работал очень хорошо +1 Tyler Rinker

Похожие вопросы