【问题标题】:R: barplot with n groups which stacks 2 valuesR:具有 n 组的条形图,堆叠 2 个值
【发布时间】:2016-05-14 14:54:58
【问题描述】:

我需要生成一个 barplot,其中包含以下内容:

我有一个包含以下列的 csv 文件:类别原因时间值

  • 类别有 7 个可能的名称 (c1 ... c7)
  • 原因有 8 个可能的名称 (n1 ... n8)
  • 时间有 2 个可能的名称(T1、T2)
  • 值是时间值

示例数据集:

Category    Reason  Time    Value
C1  R1  T1  1
C2  R1  T2  2
C1  R2  T1  3
C2  R2  T2  4
C1  R3  T1  8
C2  R3  T2  0

我想要达到的目标: 由 3 组组成的条形图(即每个原因一组),其中每组由 2 个堆叠条组成(即每个 CATEGORY 一个条),其中每个条在其顶部描绘 T1 和 T2。

我想我需要类似于R: bar plot with two groups, of which one is stacked 的东西,但不幸的是我对 R 很陌生。

类似于这张图片,以我的例子来说:

  • 5 个类别
  • 三个原因
  • 4 倍数值
  • % 作为时间值

感谢任何帮助。

【问题讨论】:

  • 在您的问题中包含reproducible example 是一个好习惯。此外:添加您尝试过的内容和可能的错误消息也非常感谢。包括这些方面将使其他人更容易帮助您,并会增加您获得所需答案的机会。
  • 除了加载 csv 并在绘图上显示数据框外,我不知道更多,例如如何将特定列组合在一起。

标签: r bar-chart


【解决方案1】:

我将向您介绍 R 中的 ggplot 包,它可能会为您提供更好的可视化问题的方法。即使它不能解决您当前的问题,ggplot 也是在 R 中启动可视化的最简单方法。

首先是代码:

library 将加载 ggplotscales

library(ggplot2)
library(scales)

生成你的虚拟数据集

df = expand.grid(factor(c("C1","C2","C3","C4","C5","C6","C6","C8")),
                 factor(c("R1","R2","R3","R4","R5","R6","R7")),
                 factor(c("T1","T2")))

Category在x轴上,Value在y轴上,Time作为需要geom_bar()的堆叠条。 ggplot 可以使用facets,而不是在条形图本身上进行分组,这会产生更清晰的结果。 scale_y_continuous() 将您的 y 轴转换为百分比。

ggplot(data = df, aes(x=Reason, y=Value, fill = Time)) + 
  geom_bar(stat='identity') + 
  facet_wrap(~Category) +
  scale_y_continuous(labels = percent) +
  theme(panel.background = element_rect(fill = "white"))

【讨论】:

  • 我在 Windows 上运行:库中的错误(ggplot2):没有名为“ggplot2”的包
  • 使用前需要安装包。运行install.packages(ggplot2)install.packages(scales)
  • 这行得通,我更喜欢网格样式,但有没有办法让白色背景,并在 x 轴上有每个原因(我不需要 1..8 x 轴(它们是类别),但我需要每组唯一且唯一的原因)
  • 您在 x 轴上有 1-7 个类别和一个分组原因。再次检查编辑后的答案。
  • 不,我不想使用数字 1-7,我想将第一组的“reason1”替换为第二组的“reason2”。我还想要一个干净的白色背景,即我不希望它们在视觉上分组在那些灰色网格中。顶部的灰色框是原因吗?如果是的话,你能把它放在图表下方吗?
【解决方案2】:

您介意分享您的 .csv 文件的一个版本吗?没有这个,我的猜测看起来像这样......

p_csv <- read.table(file.csv, header = T, sep = ",")

library(ggplot2)
#using mtcars 
ggplot(data = mtcars, aes(x = as.factor(cyl))) +
geom_bar(aes(fill = as.factor(gear)))

如果我能看到一些测试数据,我很乐意提供更多帮助 :)

仍然不是 100% 您尝试使用时间价值做什么,但这可能就足够了。我稍微调整了你的样本数据,所以时间和类别不会总是同步。

df <- data.frame("category" = c("C1", "C2", "C1", "C2", "C1", "C2"),
             "reason" = c("R1", "R1", "R2", "R2", "R3", "R3"),
             "time" = c("T1", "T1", "T1", "T2", "T2", "T2"),
             "value" = c(1,2,3,4,8,0))

ggplot(data = df, aes(x = as.factor(reason), y = value)) +
geom_bar(aes(fill = as.factor(category)), stat = "identity") +
facet_grid(~time)

【讨论】:

  • 这是机密数据,但我需要使用 barplot 功能。我将尝试重新创建一个示例 csv
  • 我在帖子中添加了一个数据集示例。
  • 感谢您的努力和时间,但是您知道我如何使用 R 中的 barplot 函数来做到这一点。时间值只是一个整数,将显示在 y 轴上, x 轴将包含不同组的名称。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-11-30
  • 2011-02-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多