【问题标题】:ggplot2 back-to-back histogramggplot2 背靠背直方图
【发布时间】:2016-10-14 16:08:05
【问题描述】:

我有一些看起来像这样的数据:

value direction
2.2 UP
2.3 DOWN
2.4 UP
2.4 DOWN
2.5 DOWN
2.5 UP
2.5 DOWN
2.5 UP
2.6 DOWN

...等等

我在 R 中使用 ggplot2 并希望制作一个背靠背直方图。我可以使用+ scale_y_reverse() 分别制作两者。但这不是我需要的。

我需要制作一个背靠背图,以便所有“DOWN”值都在负 y 轴上,UP 值在正 y 轴上。 x 轴是“值”列,y 轴是该范围内 UP 或 DOWN 的计数。

有人可以帮忙吗?这样DOWN值就按负方向计算..

感谢任何帮助。 谢谢。

【问题讨论】:

  • 将所有 DOWN 值转换为负数? data$value <- ifelse(data$direction=="DOWN",-1*value, value)
  • 关于这个问题的任何更新,或者下面的答案中缺少的部分?
  • 抱歉回复晚了。在分析师的帮助下,我能够创建一个代码,该分析师创建了我想要复制的示例图。基本上,我在 excel 中创建了 3 列——一列具有所有值,一列具有 UP 值,一列具有 DOWN 值。从那里,我使用具有所有值的列、UP 直方图和 DOWN 直方图创建了中断,其中 DOWN 计数为 (-DOWN.hist$counts),UP 为 (UP.hist$counts)。使用 plot 函数然后非常有效地组合两个图。
  • 如果有人有兴趣并想查看代码,请告诉我。这是一个漫长的试错过程。感谢大家的帮助! -克莱尔 G.

标签: r ggplot2


【解决方案1】:

我认为最直接的方法是自己计算垃圾箱,然后反转它们的符号。

首先,一些大到足以展示效果的样本数据:

testData <-
  data.frame(
    value = rnorm(1000, 10, 2)
    , direction = sample(c("UP","DOWN")
                         , 1000
                         , TRUE)
  )

然后,cut 将数据放入您选择的箱中,并将其中一组的值修改为负数。 (使用dplyrmagrittr

toPlot <-
  testData %>%
  mutate(bin = cut(value, pretty(value, 20))) %$%
  table(bin, direction) %>%
  as.data.frame() %>%
  mutate(plotVal = ifelse(direction == "DOWN"
                          , -1*Freq
                          , Freq))

然后,将该 data.frame 传递给ggplot,您应该会得到您想要的。 (注意,这里使用的是ggplot2的开发版,如果你使用的是稳定版,你可能需要使用geom_bar(stat = "identity")而不是geom_col)。

toPlot %>%
  ggplot(aes(x = bin
             , y = plotVal
             , fill = direction)) +
  geom_col()

显然,根据您的兴趣清理标签和颜色。

最后一点,根据您的用例,您可能需要考虑这种“背靠背”方法是否真的是您想要的。这使得比较条形的高度变得非常困难。

【讨论】:

  • 抱歉回复晚了。在分析师的帮助下,我能够创建一个代码,该分析师创建了我想要复制的示例图。基本上,我在 excel 中创建了 3 列——一列具有所有值,一列具有 UP 值,一列具有 DOWN 值。从那里,我使用具有所有值的列、UP 直方图和 DOWN 直方图创建了中断,其中 DOWN 计数为 (-DOWN.hist$counts),UP 为 (UP.hist$counts)。然后使用 plot 函数非常有效地组合这两个图。
  • 如果有人有兴趣并想查看代码,请告诉我。这是一个漫长的试错过程。感谢大家的帮助! -克莱尔 G.
  • 我发布的答案没有对你有用吗?只是想知道这在哪里出现了不足。
  • 不,您的回答没有问题。它是彻底的,对理解很有帮助。我确实尝试使用 ggplot 并考虑到您的答案,但发现 hist 和 plot 更简单。如果我在不久的将来有更多时间,我计划再次尝试使用 ggplot。
  • 感谢您的回答!您是否可以将两个图垂直移动(即如何在两者之间添加一个垂直空间),以制作如图 1 中的图(link.springer.com/article/10.1007/s00426-018-1112-6)?
猜你喜欢
  • 2010-11-23
  • 1970-01-01
  • 1970-01-01
  • 2021-08-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-12-02
  • 2013-07-18
相关资源
最近更新 更多