我正在使用直方图来绘制我的 3 组数据。但正如直方图所做的那样,它计算每个组有多少这些值(在 x 轴),而我想要的是该值出现/出现的百分比(以 % 为单位)。
这是我生成的图,我使用这个常规代码来绘制直方图:
ggplot2.histogram(data=dat, xName='dens',
groupName='lines', legendPosition="top",
alpha=0.1) +
labs(x="X", y="Count") +
theme(panel.border = element_rect(colour = "black"),
panel.grid.minor = element_blank(),
axis.line = element_line(colour = "black")) +
theme_bw()+
theme(legend.title=element_blank())
有什么想法/建议吗?
我们可以用
count
计算统计量的相对值替换 y 美学,并设置比例以显示百分比:
ggplot2.histogram(data=dat, xName='dens',
groupName='lines', legendPosition="top",
alpha=0.1) +
labs(x="X", y="Count") +
theme(panel.border = element_rect(colour = "black"),
panel.grid.minor = element_blank(),
axis.line = element_line(colour = "black")) +
theme_bw()+
theme(legend.title=element_blank()) +
aes(y = after_stat(count)/sum(after_stat(count))) +
scale_y_continuous(labels = scales::percent)
如果我理解正确的话,那么
fill
会回答你的问题吗?
举个例子,
mtcars %>%
ggplot(aes(x = factor(gear), group = factor(cyl), fill = factor(cyl))) +
geom_bar(position = "fill")
在这里,您不再有计数,但对于沿
x
轴的每个值,您可以绘制每组(此处:圆柱体)的百分比。
如果这不是您想要的,一般建议是先计算您想要绘制的数据,然后绘制它。也就是说,许多人认为通常建议将计算/转换/聚合与绘图分开。
为了跟进我将计算与可视化分开的建议,让我们考虑
mtcars
数据集并重点关注 gear
和 carb
。
with(mtcars, table(gear, carb))
carb
gear 1 2 3 4 6 8
3 3 4 3 5 0 0
4 4 4 0 4 0 0
5 0 2 0 1 1 1
例如,您会看到 32 个观测值(共 32 个)具有
gear = 3, carb = 1
,略低于 10%。同样,4 个观测值具有 gear = 4, carb = 1
,略高于 10%。让我们直接得到百分比:
with(mtcars, prop.table(table(gear, carb)))
carb
gear 1 2 3 4 6 8
3 0.09375 0.12500 0.09375 0.15625 0.00000 0.00000
4 0.12500 0.12500 0.00000 0.12500 0.00000 0.00000
5 0.00000 0.06250 0.00000 0.03125 0.03125 0.03125
我在这里使用了
prop.table
,它也有一个边距参数。也就是说,如果您想知道条件百分比,您可以轻松调整它(见下文)。不过,让我们暂时保留这一点。假设我们现在想要在计算完数字后将其可视化,我们可以简单地调用以下内容:
with(mtcars, prop.table(table(gear, carb))) %>%
as.data.frame() %>%
ggplot(aes(x = factor(carb), y = Freq, group = factor(gear), fill = factor(gear))) +
geom_bar(stat = "identity")
这会给我们:
现在假设您想要获得条件版本,例如
with(mtcars, prop.table(table(gear, carb), margin = 1))
carb
gear 1 2 3 4 6 8
3 0.2000000 0.2666667 0.2000000 0.3333333 0.0000000 0.0000000
4 0.3333333 0.3333333 0.0000000 0.3333333 0.0000000 0.0000000
5 0.0000000 0.4000000 0.0000000 0.2000000 0.2000000 0.2000000
注意每一行的总和为 1。这可以用相同的方式绘制:
with(mtcars, prop.table(table(gear, carb), margin = 1)) %>%
as.data.frame() %>%
ggplot(aes(x = factor(carb), y = Freq, group = factor(gear), fill = factor(gear))) +
geom_bar(stat = "identity")
注意与以下生成的平滑版本的相似性:
mtcars %>%
ggplot(aes(x = factor(carb), group = factor(gear), fill = factor(gear))) +
geom_density(alpha = 0.5)