我正在制作一个条形图,显示返回巢穴的不同类型猎物的百分比。
我的数据如下:
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")
我的图表如下图所示。
我希望所有“类型”条宽度都相同,但是当我更改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")
答案 0 :(得分:3)
在绘制之前使用table
和prop.table
准备数据,确保所有可能的Prey
组合Type
包括在内。这会强制条具有相同的宽度而不会改变条的顺序。
所以,这是一种替代方法 已标记为重复的using interaction或binding 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")
生成
table(Preydata$Prey, Preydata$Type)
创建了{em>所有组合Prey
和Type
的列联表,甚至包括基础数据中未出现的那些组合:
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中引入的新功能)。