【问题标题】:ggplot2 Multiple continuous variable plottingggplot2 多连续变量绘图
【发布时间】:2016-11-14 19:07:34
【问题描述】:

我有一个如下所示的数据集:

  Distance  Mean    SD Median    VI Vegetation.Index       Direction  X X.1 X.2 X.3
1      10m 0.525 0.082  0.530  NDVI             NDVI Whole Landscape NA  NA  NA  NA
2      25m 0.517 0.085  0.523  NDVI             NDVI Whole Landscape NA  NA  NA  NA
3      50m 0.509 0.086  0.514  NDVI             NDVI Whole Landscape NA  NA  NA  NA
4     100m 0.494 0.090  0.497  NDVI             NDVI Whole Landscape NA  NA  NA  NA
5      10m 0.545 0.076  0.551 NDVIe             NDVI            East NA  NA  NA  NA
6      25m 0.542 0.078  0.549 NDVIe             NDVI            East NA  NA  NA  NA


> dput(droplevels(head(data)))
structure(list(Distance = structure(c(2L, 3L, 4L, 1L, 2L, 3L), .Label = c("100m", 
"10m", "25m", "50m"), class = "factor"), Mean = c(0.525, 0.517, 
0.509, 0.494, 0.545, 0.542), SD = c(0.082, 0.085, 0.086, 0.09, 
0.076, 0.078), Median = c(0.53, 0.523, 0.514, 0.497, 0.551, 0.549
), VI = structure(c(1L, 1L, 1L, 1L, 2L, 2L), .Label = c("NDVI", 
"NDVIe"), class = "factor"), Vegetation.Index = structure(c(1L, 
1L, 1L, 1L, 1L, 1L), .Label = "NDVI", class = "factor"), Direction = structure(c(2L, 
2L, 2L, 2L, 1L, 1L), .Label = c("East", "Whole Landscape"), class = "factor"), 
X = c(NA, NA, NA, NA, NA, NA), X.1 = c(NA, NA, NA, NA, NA, 
NA), X.2 = c(NA, NA, NA, NA, NA, NA), X.3 = c(NA, NA, NA, 
NA, NA, NA)), .Names = c("Distance", "Mean", "SD", "Median", 
"VI", "Vegetation.Index", "Direction", "X", "X.1", "X.2", "X.3"
), row.names = c(NA, 6L), class = "data.frame")

我想创建一个条形图分面网格,其中 x 轴上的分类变量(距离)、y 轴上的连续变量(植被指数)和每个条形图的两个条形图(平均和中值植被指数值) .条形图按“方向”和“植被指数”绘制刻面。

我已经用一种类型的度量(平均值)做到了这一点,如下图所示。

这是我现在的代码:

 p = ggplot(data,aes(x=Distance,y=Mean,fill=Distance)) + geom_bar(stat =
    'identity',position='dodge')+ facet_grid(Direction~Vegetation.Index)+ 
    coord_cartesian(ylim=c(0.2,0.95)) + geom_errorbar(data = data,
    aes(ymin=Mean-SD,ymax=Mean+SD),width=0.5)

但我还想要一个中位数栏。

Like this 但对于分面网格中的所有条形图。

我发现一些人想要做这个完全相同或类似的事情,并发现它们相当有用:

This

Or this

但是,我的数据看起来与他们的(我认为)非常不同,并且以任何方式更改它都会弄乱我已有的数据。据我了解,我必须使用 group='Mean+Median'。

【问题讨论】:

  • 请发送reproducible example (click link for many tips)。不要共享数据图像。取而代之的是 (a) 使用看起来像您的数据的内置数据,(b) 共享短代码来模拟示例数据,或 (c) 使用 dput() 可重复地共享您的数据(或者可能是您的数据的子集)。
  • 另外,请更清楚您想要的输出。 “沿 x 轴的多个连续变量”没有多大意义,尤其是对于条形图。条形图的 x 轴是分类的,而不是连续的。您的意思是您想要沿 x 轴的度量类型,例如,一根表示中位数,一根表示平均值?
  • 根据您的澄清,您的第一个问题链接似乎是几乎完全相同的重复。您需要将数据转换为长格式,其中有一个“measure”列,该列采用"mean""median" 的值和一个“value”列,取平均值或中位数的数值。您可以使用 melt just like in this answer 来做到这一点。
  • 如果你能调整你对变量的想法,你将会有更好的运气与ggplot一起工作。条形图中唯一的连续变量是 y 轴。您想要 y 轴上的连续 ,并且您想要 x 轴上的分类 measure(平均值或中位数)。如果您按照上面的要求可重复地共享您的数据,我将很乐意在答案中进行演示。 没有以可用方式共享的特定数据,我建议将您的问题作为您链接的问题的副本关闭。
  • 非常感谢 Gregor 的 cmets 和建议!我发布了我的数据样本以及您建议的 dput() 。我希望这是可重现的。

标签: r ggplot2 geom-bar facet-grid


【解决方案1】:

使用您的示例数据,我们首先将其转换为长格式。我在这里使用tidyr::gather,但reshape2::melt(或data.table::melt)的工作方式类似。

library(tidyr)
dfl = gather(df, key = measure, value = value, Mean, Median)

dodge_width = 0.8
ggplot(dfl,
       aes(x = measure, y = value, fill = Distance, group = Distance)) +
    geom_bar(stat = 'identity',
             position = position_dodge(dodge_width),
             width = dodge_width) +
    facet_grid(Direction ~ Vegetation.Index) + 
    coord_cartesian(ylim = c(0.2, 0.95)) + 
    geom_errorbar(
        aes(ymin = value - SD, ymax = value + SD),
        width=0.5,
        position = position_dodge(dodge_width)
    )

【讨论】:

  • 太棒了。你非常有帮助。非常感谢!这也准确地指出了我的尝试出错的地方。我对 R 很陌生,所以目前语法有点笨拙。再次感谢!!
  • 很高兴您发现它有帮助!如果您打算大量使用ggplot,我强烈建议您阅读the Tidy Data paper - 95% 的新用户使用ggplot 获取的数据格式正确,而整洁的数据文件有助于描述目标。下次您提出关于 SO 的问题时,您就会知道从一开始就可重复地共享数据 :)
  • 我一定会读一读的!同上共享数据。再次感谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-07-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-10-16
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多