在ggplot上更改geom_bar宽度

时间:2017-01-31 22:28:40

标签: r ggplot2

我正在制作一个条形图,显示返回巢穴的不同类型猎物的百分比。

我的数据如下:

Prey <- c(rep("Bird", 12), rep("Lizard", 3), rep("Invertebrate", 406))  
Type <- c(rep("Unknown bird", 12), rep("Skink", 2), rep("Gecko", 1), 
          rep("Unknown Invertebrate", 170), rep("Beetle", 1), 
          rep("Caterpillar", 3), rep("Grasshopper", 3), rep("Huhu grub", 1),  
          rep("Moth", 34), rep("Praying mantis", 1), rep("Weta", 193))  
Preydata <- data.frame(Prey,Type)  

ggplot(Preydata, aes(x = Prey, y = (..count..)/sum(..count..))) +
                  scale_y_continuous(labels = percent_format()) + 
                  geom_bar(aes(fill = Type), position = "dodge")

我的图表如下图所示。

enter image description here

我希望所有“类型”条宽度都相同,但是当我更改geom_bar下的宽度时,它只会改变“猎物”条的宽度。当我尝试使用以下内容时:

ggplot(Preydata, aes(x = as.numeric(interaction(Prey, Type)), 
    y = (..count..)/sum(..count..))) + 
    scale_y_continuous(labels = percent_format()) + 
    geom_bar(aes(fill = Type), position = "dodge")

我的酒吧不再按正确顺序排列,或按“猎物”分组。有什么办法可以改变吗? enter image description here

1 个答案:

答案 0 :(得分:3)

在绘制之前使用tableprop.table 准备数据,确保所有可能的Prey组合Type包括在内。这会强制条具有相同的宽度而不会改变条的顺序。

所以,这是一种替代方法 已标记为重复的using interactionbinding missing combinations

Preydata2 <- as.data.frame(prop.table(table(Preydata$Prey, Preydata$Type)))
names(Preydata2) <- c("Prey", "Type", "Freq")

library(ggplot2)
library(scales)
ggplot(Preydata2, aes(x = Prey, y = Freq, fill = Type)) +
  scale_y_continuous(labels = percent_format()) + 
  geom_col(position = "dodge")

生成

enter image description here

说明

table(Preydata$Prey, Preydata$Type)创建了{em>所有组合PreyType的列联表,甚至包括基础数据中未出现的那些组合:

             Beetle Caterpillar Gecko Grasshopper Huhu grub Moth Praying mantis Skink Unknown bird
Bird              0           0     0           0         0    0              0     0           12
Invertebrate      1           3     0           3         1   34              1     0            0
Lizard            0           0     1           0         0    0              0     2            0

             Unknown Invertebrate Weta
Bird                            0    0
Invertebrate                  170  193
Lizard                          0    0

prop.table将分数计算在内。这相当于OP中的(..count..)/sum(..count..)

数据准备的最后一步是将表转换为数据框,ggplot所需的格式,并适当地重命名列。

绘图命令类似于OP,除了

  • 已使用已计算的Freq而不是动态计算(..count..)/sum(..count..)
  • fill美学已移至ggplot()
  • 的初始调用
  • geom_col用作geom_bar(stat = "identity")的简写(ggplot2版本2.2.0中引入的新功能)。