R ggplot填充变量添加到100%

R ggplot填充变量添加到100%,r,ggplot2,R,Ggplot2,这是一个数据帧 DF <- data.frame(SchoolYear = c("2015-2016", "2016-2017"), Value = sample(c('Agree', 'Disagree', 'Strongly agree', 'Strongly disagree'), 50, replace = TRUE)) 有没有办法使每个学年的数据总和达到100%,但不将数据叠加在图表中 我知道这个问题和这个问题很相似,但我不想把图表叠起来。

这是一个数据帧

DF <- data.frame(SchoolYear = c("2015-2016", "2016-2017"), 
                 Value = sample(c('Agree', 'Disagree', 'Strongly agree', 'Strongly disagree'), 50, replace = TRUE))

有没有办法使每个学年的数据总和达到100%,但不将数据叠加在图表中


我知道这个问题和这个问题很相似,但我不想把图表叠起来。我不知道如何将我问题中的解决方案应用于这种情况。此外,我不希望在绘制图表之前对数据进行汇总,因为我必须多次使用不同的数据绘制此图表,并且不希望每次都对数据进行汇总

我不知道如何在不转换数据的情况下创建所需的绘图。但是,如果要对多个数据集重复使用相同的代码,可以编写一个函数来转换数据并同时生成绘图:

plot.fun <- function (original.data) {
    newDF <- reshape2::melt(apply(table(original.data), 1, prop.table))
    Plot <- ggplot(newDF, aes(x=Value, y=value)) + 
            geom_bar(aes(fill=SchoolYear), stat="identity", position="dodge") +
            geom_text(aes(group=SchoolYear, label=scales::percent(value)), stat="identity", vjust=-0.25, size=2, position=position_dodge(width=0.85)) + 
            scale_y_continuous(labels=scales::percent) + 
            ylab("Percent") + xlab("Response") +   
            theme(axis.text.x = element_text(angle = 75, hjust = 1))
    return (Plot)
}
plot.fun(DF)

plot.fun我不知道如何在不转换数据的情况下创建所需的绘图。但是,如果要对多个数据集重复使用相同的代码,可以编写一个函数来转换数据并同时生成绘图:

plot.fun <- function (original.data) {
    newDF <- reshape2::melt(apply(table(original.data), 1, prop.table))
    Plot <- ggplot(newDF, aes(x=Value, y=value)) + 
            geom_bar(aes(fill=SchoolYear), stat="identity", position="dodge") +
            geom_text(aes(group=SchoolYear, label=scales::percent(value)), stat="identity", vjust=-0.25, size=2, position=position_dodge(width=0.85)) + 
            scale_y_continuous(labels=scales::percent) + 
            ylab("Percent") + xlab("Response") +   
            theme(axis.text.x = element_text(angle = 75, hjust = 1))
    return (Plot)
}
plot.fun(DF)

plot.fun重大免责声明:我强烈建议您事先汇总数据,不要尝试在
ggplot
中进行这些计算。这不是
ggplot
的本意。此外,它不仅不必要地使代码复杂化,而且很容易引入错误/意外结果

有鉴于此,您想要的似乎是可行的(不需要先总结)。通过在ggplot中进行计算来获得所需内容的一种非常简单的方法是:

#Store factor values
fac <- unique(DF$SchoolYear)

ggplot(DF, aes(x = Value, fill = SchoolYear)) +
  geom_bar(position = 'dodge', aes(y = (..count..)/stats::ave(..count.., get("fac", globalenv()), FUN = sum))) +   
  geom_text(aes(y = (..count..)/stats::ave(..count.., get("fac", globalenv()), FUN = sum), label = scales::percent((..count..)/stats::ave(..count.., get("fac", globalenv()), FUN = sum))),
            stat = "count", vjust = -0.25, size = 2, position = position_dodge(width = 0.9)) + 
  scale_y_continuous(labels = percent) + 
  ylab("Percent") + xlab("Response") +   
  theme(axis.text.x = element_text(angle = 75, hjust = 1))

重大免责声明:我强烈建议您事先总结数据,不要试图在
ggplot
中进行这些计算。这不是
ggplot
的本意。此外,它不仅不必要地使代码复杂化,而且很容易引入错误/意外结果

有鉴于此,您想要的似乎是可行的(不需要先总结)。通过在ggplot中进行计算来获得所需内容的一种非常简单的方法是:

#Store factor values
fac <- unique(DF$SchoolYear)

ggplot(DF, aes(x = Value, fill = SchoolYear)) +
  geom_bar(position = 'dodge', aes(y = (..count..)/stats::ave(..count.., get("fac", globalenv()), FUN = sum))) +   
  geom_text(aes(y = (..count..)/stats::ave(..count.., get("fac", globalenv()), FUN = sum), label = scales::percent((..count..)/stats::ave(..count.., get("fac", globalenv()), FUN = sum))),
            stat = "count", vjust = -0.25, size = 2, position = position_dodge(width = 0.9)) + 
  scale_y_continuous(labels = percent) + 
  ylab("Percent") + xlab("Response") +   
  theme(axis.text.x = element_text(angle = 75, hjust = 1))

您可以在绘图之前汇总数据,请参阅@MikeH的可能副本。有没有一种方法可以在不事先总结我的数据的情况下完成这项工作?您可以在绘图之前总结您的数据,请参阅@MikeH的可能副本。有没有一种方法不必在手前总结我的数据就可以做到这一点?谢谢你的建议!谢谢你的建议!谢谢你的建议和建议。我感谢你的帮助!谢谢你的建议和建议。我感谢你的帮助!