【问题标题】:simple boxplot using qplot/ggplot2使用 qplot/ggplot2 的简单箱线图
【发布时间】:2016-08-24 23:27:50
【问题描述】:

这是我的第一篇文章,所以请放轻松。直到现在(过去约 5 年?)我已经能够以正确的方式调整我的 R 代码,或者在这个或其他各种网站上找到答案。当我说我一直在寻找答案时,请相信我! 我有一个工作脚本可以在基本 R 中创建附加的箱线图。 http://i.stack.imgur.com/NaATo.jpg

这很好,但我真的只是想在 ggplot 中“爵士乐”它,原因是徒劳的。 我查看了以下问题,它们很接近,但并不完整: Why does a boxplot in ggplot requires axis x and y? How do you draw a boxplot without specifying x axis?

如果所有数值变量都在同一尺度上,我的数据基本上就像“mtcars”。 我要做的就是在同一个箱线图上绘制每个变量,就像我上面制作的基本 R 箱线图一样。对于每个框,我的 y 轴是相同的连续刻度(0 到 1),x 轴只是标记每个月加上一个年度平均值(认为所有 mtcars 在 y 轴上的值都相同,x 轴是每个车辆型号)。我的数据的每个框代表 75 个观察值(有点像 mtcars 有 75 种不同的车辆模型),同样所有的框都是相同的比例。 我错过了什么?

【问题讨论】:

  • ggplot 需要长格式数据。您需要使用 tidyr::gatherreshape2::melt 将数据转换为长格式。这不会在mtcars 上很好地演示,因为 (a) mtcars 没有 x 轴的 ID 变量(尽管我们可以将行名转换为列)并且 (b) 它看起来不太好用一些离散数据几乎没有相同规模的东西。但是,如果您以长格式获取数据,您的 ggplot 应该像 ggplot(long_data, aes(x = variable, y = value)) + geom_boxplot() 一样简单。
  • 基本上,如果 mtcars 是 75 个车辆模型,并且每个列变量是 10 列的圆柱体。圆柱的每一列都是不同的年份。所以它涵盖了 1986 年到 1995 年的汽缸价值。基本上我会写:
  • SORRY---,基本上我会写一些类似的东西:boxplot(mtcars$cyl1986, mtcars$cyl1987...) 等等。但我一辈子都不能在 ggplot 或 qplot 中做这个简单的箱线图。我知道这是因为它是一个更高级的包,但仍然如此。

标签: r ggplot2 boxplot


【解决方案1】:

虽然我不认为 mtcars 是一个很好的例子,但这里是:

首先,我们通过使用列而不是行名使数据(希望)与您的数据更相似。

mt = mtcars
mt$car = row.names(mtcars)

然后我们重塑为长格式:

mt_long = reshape2::melt(mt, id.vars = "car")

那么剧情就简单了:

library(ggplot2)
ggplot(mt_long, aes(x = variable, y = value)) +
    geom_boxplot()

使用ggplot all 但需要“长”格式而不是“宽”格式的数据。如果您希望将某些东西映射到图形维度(x 轴、y 轴、颜色、形状等),那么 它应该是数据中的一列。幸运的是,使用reshape2::melttidyr::gather 通常很容易以正确的格式获取数据。我建议阅读 the Tidy Data paper 以了解有关此主题的更多信息。

【讨论】:

  • 基本上,如果 mtcars 是 75 种车辆模型,并且每个列变量仅是 10 列价值的气缸。圆柱的每一列都是不同的年份。所以它涵盖了 1986 年到 1995 年的汽缸价值。基本上我会写一些类似的东西:boxplot(mtcars$cyl1986, mtcars$cyl1987...) 等等。但我一辈子都不能在 ggplot 或 qplot 中做这个简单的箱线图。我知道这是因为它是一个更高级的软件包,但仍然如此。我尝试了这段代码,得到了一些非常不同的东西。 (无法弄清楚如何将其附加到此评论。这样的菜鸟。
  • 代码不应该进入 cmets - 它非常狭窄。您应该做的是可重复地共享您的一些实际数据。在您的问题中输入dput(droplevels(head(your_data, 20)))
  • 也就是说,如果你打开一个新的 R 会话并运行我展示的代码 - 假设你有 ggplot2reshape2 的相对最新版本,你应该完全匹配我的输出。这里没有烟雾和镜子。我复制/粘贴了我的代码并绘制到这个答案中。
  • 我在这里非常不合群,所以我感谢 immensley 愿意帮助我。我可能只需要保留我的基本 R 图,因为我根本无法弄清楚这一点。我不知道如何在此评论部分进一步粘贴任何内容(让反对票继续!),但充其量我只能描述我的数据集。我有一个包含 13 列和 75 行数据的 csv 文件。这些行是具有汞读数的位置,因此有 75 个不同的位置。这些列是每个月的汞读数(第一列是每个位置的名称)。
  • Gregor,我要感谢你昨晚非常迅速地帮助我。到今天早上,我的一切都运转良好,这都是因为你。你摇滚!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-02-14
相关资源
最近更新 更多