R 如何在汇总数据上绘制叠加条形图

R 如何在汇总数据上绘制叠加条形图,r,R,对于名为df的数据,其内容如下: car suv pickup 1 2 1 2 3 4 4 1 2 5 4 2 3 1 1 所以我现在做的是画一个汽车总数的条形图,实际上是每行的总和。我现在要做的是将其显示为总和上的堆栈条形图 现在,它只会显示“总计”,没有任何线条指示1辆车、2辆suv、1辆皮卡是否等于4“总计” 注意。它不同于条形图(矩阵(df)),因为这只是将其除以我的车、suv、皮卡,而不考虑总数 你想要这样的东西吗 library(t

对于名为df的数据,其内容如下:

car suv pickup
 1   2   1
 2   3   4
 4   1   2
 5   4   2
 3   1   1
所以我现在做的是画一个汽车总数的条形图,实际上是每行的总和。我现在要做的是将其显示为总和上的堆栈条形图

现在,它只会显示“总计”,没有任何线条指示1辆车、2辆suv、1辆皮卡是否等于4“总计”


注意。它不同于条形图(矩阵(df)),因为这只是将其除以我的车、suv、皮卡,而不考虑总数

你想要这样的东西吗

library(tidyverse)
df %>%
    rowid_to_column("row") %>%
    gather(k, v, -row) %>%
    ggplot(aes(row, v, fill = k)) +
    geom_col()

我们在这里使用堆叠的条形图,因此不需要手动计算总和。这里的关键是将数据从宽转换为长,并跟踪行


样本数据
df您可以使用
ggplot2
restrape2
轻松实现这一点。 您将需要一个ID列来跟踪行,因此我在中添加了它。我将数据融化为长类型,以便可以相应地管理和绘制不同的组。 然后使用
geom_-bar
,将行ID指定为x轴,并为堆栈打印和图例指定分组(
fill
color

library(reshape2)
library(ggplot2)
df <- data.frame("ID" = c(1,2,3,4,5), "car" = c(1,2,4,5,3), "suv" = c(2,3,1,4,1), "pickup" = c(1, 4, 2, 2, 1))
long_df <- df %>% melt(id.vars = c("ID") ,value.name = "Number", variable.name = "Type")

ggplot(data = long_df, aes(x = ID, y = Number)) +
  geom_bar(aes(fill = Type, colour = Type),
           stat = "identity",
           position = "stack")

如果您试图可视化跨行的总和,可能需要
条形图(t(df))
?我实际上想尝试不同的东西,因为我正在学习。实际上我也做了
barplot(t(df))
。我只是想看看我们是否可以在不转置的情况下做同样的事情。不使用
t()
的方法是将数据从“宽”转换为“长”,如下面的答案所述。我们是否也可以使用base R工具来执行此操作?还是ggplot总是必要的?是的,你需要做一些我理解的修改,但我已经做了,并且编辑了这篇文章。Base中的大部分内容都可以在
ggplot2
中完成,反之亦然。我更喜欢
ggplot2
,它看起来更直观,需要更少的技巧才能使绘图更漂亮。语法结构也更容易使用。
df <- read.table(text =
    "car suv pickup
 1   2   1
 2   3   4
 4   1   2
 5   4   2
 3   1   1", header = T)
library(reshape2)
library(ggplot2)
df <- data.frame("ID" = c(1,2,3,4,5), "car" = c(1,2,4,5,3), "suv" = c(2,3,1,4,1), "pickup" = c(1, 4, 2, 2, 1))
long_df <- df %>% melt(id.vars = c("ID") ,value.name = "Number", variable.name = "Type")

ggplot(data = long_df, aes(x = ID, y = Number)) +
  geom_bar(aes(fill = Type, colour = Type),
           stat = "identity",
           position = "stack")
df %>% melt(id.vars = c("ID") ,value.name = "Number", variable.name = "Type") %>% 
  dcast(Type ~ ID, value.var = "Number") %>% 
  as.matrix() %>% 
  barplot()