让ggplot2直方图显示y轴上的分类百分比

Fen*_*Mai 12 r ggplot2

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)

在此输入图像描述

  • 与其将aes的y向量缩放为100,还可以添加scale_y_continuous(labels = percent)。 (2认同)

Fen*_*Mai 6

似乎将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)

在此输入图像描述