library(ggplot2)
data = diamonds[, c('carat', 'color')]
data = data[data$color %in% c('D', 'E'), ]
Run Code Online (Sandbox Code Playgroud)
我想比较颜色D和E的克拉直方图,并使用y轴上的分类百分比.我尝试过的解决方案如下:
解决方案1:
ggplot(data=data, aes(carat, fill=color)) + geom_bar(aes(y=..density..), position='dodge', binwidth = 0.5) + ylab("Percentage") +xlab("Carat")
Run Code Online (Sandbox Code Playgroud)

这不太正确,因为y轴显示估计密度的高度.
解决方案2:
ggplot(data=data, aes(carat, fill=color)) + geom_histogram(aes(y=(..count..)/sum(..count..)), position='dodge', binwidth = 0.5) + ylab("Percentage") +xlab("Carat")
Run Code Online (Sandbox Code Playgroud)

这也不是我想要的,因为用于计算y轴上的比率的分母是D + E的总数.
有没有办法用ggplot2的堆积直方图显示分组百分比?也就是说,不是在y轴上显示(bin中的ob数)/ count(D + E),而是希望它显示(bin中的obs数量)/ count(D)和(bin中的obs数量)/count(E)分别为两个颜色类.谢谢.
pic*_*ick 10
您可以通过使用..group..特殊变量对..count..矢量进行子集来按组进行缩放.由于所有的点,这是非常丑陋,但它在这里
ggplot(data, aes(carat, fill=color)) +
geom_histogram(aes(y=c(..count..[..group..==1]/sum(..count..[..group..==1]),
..count..[..group..==2]/sum(..count..[..group..==2]))*100),
position='dodge', binwidth=0.5) +
ylab("Percentage") + xlab("Carat")
Run Code Online (Sandbox Code Playgroud)

似乎将ggplot2之外的数据分箱是可行的.但我仍然有兴趣看看是否有办法用ggplot2做到这一点.
library(dplyr)
breaks = seq(0,4,0.5)
data$carat_cut = cut(data$carat, breaks = breaks)
data_cut = data %>%
group_by(color, carat_cut) %>%
summarise (n = n()) %>%
mutate(freq = n / sum(n))
ggplot(data=data_cut, aes(x = carat_cut, y=freq*100, fill=color)) + geom_bar(stat="identity",position="dodge") + scale_x_discrete(labels = breaks) + ylab("Percentage") +xlab("Carat")
Run Code Online (Sandbox Code Playgroud)
