不要掉落零计数:闪避的barplot

我在ggplot2中做了一个闪避的barplot,一个分组有一个零计数,我想要显示。 我记得以前在这里看到这个,并认为scale_x_discrete(drop=F)会起作用。 它似乎不适用于躲闪的酒吧。 我怎样才能使零点显示?

例如,(下面的代码)在下面的图中,type8〜group4没有例子。 我仍然希望情节显示零计数的空白空间,而不是消除酒吧。 我该怎么做?

在这里输入图像描述

 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 

我知道的唯一方法是预先计算计数并添加一个虚拟行:

 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") 

在这里输入图像描述

我认为使用stat_bin(drop = FALSE,geom = "bar",...)会起作用,但显然不会。

更新的 geom_bar()需要stat = "identity"

值得的是:上面的计数表dat包含NA。 有时候,有一个明确的0是有用的。 例如,如果下一步是将计数放在条上方。 下面的代码就是这样做的,尽pipe这可能不是乔兰的简单。 它涉及两个步骤:使用dcast获取计数的交叉表,然后dcast使用meltggplot()melt表。

 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) 

在这里输入图像描述

我问了同样的问题,但我只想使用data.table ,因为它是更大型数据集的更快解决scheme。 我在数据中join了笔记,以便那些经验较less并想明白为什么我做了我所做的事的人可以轻松地做到这一点。 这里是我如何操作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) 

它产生这个图:

圆柱图

此外,如果有连续的数据,如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") 

给我们这张图:

钻石固定

您可以利用table()函数的function,该函数计算所有级别的因子出现次数

 # 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") 

结果图