ggplot2 条形图,总值分为两组

ggplot2 barplot with total values split into two groups

假设我有一个数据框:

df<-data.frame(specie=c('apple','banana','orange'),total=c(1000,500,850),fresh=c(NA,250,700),processed=c(NA,250,150))

请注意,对于 Apple,只有总值可用。 我想创建一个条形图,显示每个物种的新鲜值和处理值,并且只显示苹果的总值,其中新鲜值和处理值是 NAs。

我尝试了下面的代码,但没有得到我想要的情节:

p<-df %>% ggplot(aes(x=total,y=specie))
p+geom_col()+geom_col(aes(x=fresh,fill="fresh"))+geom_col(aes(x=processed,fill="processed"))

为什么总面积超过新鲜和加工?

所以,你有三个类别。这些将一个个叠加在另一个上面。所以 ggplot 绘制 NA 条,然后是顶部的新鲜条,最后是处理过的条。我想你想要堆叠的条形图,它们将总数加起来。因此,相反,您需要一个更长的数据框,其中包含一个水果类型列,并且您不需要总数。您绘制时将地图填充到类型上。像这样:

df<-data.frame(specie=c('apple','banana','orange', 'banana','orange'),type = c(NA, "fresh", "fresh", "processed","processed"), num=c(1000, 250, 700,250,150))
df %>% ggplot(aes(x=num,y=specie, fill= type))+geom_col(position='stack')

您需要重新处理您的数据集,使您的列名称成为变量的模态,并且所有值都在同一列中。

df<-data.frame(specie=c('apple','banana','orange'),unknow=c(1000,NA,NA),fresh=c(NA,250,700),processed=c(NA,250,150))
df <- df %>% tidyr::pivot_longer(cols = c("unknow", "fresh", "processed"),names_to = "type")



ggplot2::ggplot() +
  ggplot2::geom_bar(data = df,
                    mapping = ggplot2::aes(x = specie,
                                           y = value,
                                           fill = type),
                    stat = "identity")