我正在使用直方图来绘制我的3组数据。但是,就像直方图一样,它计算每个组中有多少(在x轴上)这些值,而我想要的是该值出现/出现的百分比(以百分比为单位)。
这是我生成的图形,我使用下面的常规代码绘制直方图:
datepicker
有什么想法/建议吗?
答案 0 :(得分:1)
如果我对您的理解正确,那么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
。
gear = 3, carb = 1
例如,您看到32个观察结果中有3个具有gear = 4, carb = 1
,这还不到10%。同样,有4个观测值具有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
,这比10%多一点。让我们直接获取百分比:
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")
,它也有一个margin参数。也就是说,如果您想了解条件百分比,则可以轻松地对此进行调整(请参见下文)。不过,暂时让我们继续。假设我们要在计算完数字后现在就可视化它,我们可以简单地调用以下代码:
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
这将给我们:
现在假设您要获取条件版本,例如
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")
请注意每一行总计为1。可以用相同的方式绘制该图:
mtcars %>%
ggplot(aes(x = factor(carb), group = factor(gear), fill = factor(gear))) +
geom_density(alpha = 0.5)
请注意与以下版本产生的平滑版本的相似性:
{{1}}
答案 1 :(得分:0)
我们可以用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=stat(count)/sum(stat(count))) +
scale_y_continuous(labels = scales::percent)