【问题标题】:How to set dynamic data limits across facets in ggplot2? [duplicate]如何在ggplot2中设置跨方面的动态数据限制? [复制]
【发布时间】:2022-01-06 02:12:58
【问题描述】:

我有一个数据集,我在 R 中争吵过,列出了 3 个不同时期内特定地点的访客人数变化:2019 年、2020 年、2021 年。其中一些变化非常大 (+/- ~200),但大多数都很小,(+/- ~2)。

我需要在 ggplot2 中为我正在构建的仪表板绘制这些更改,并按位置分面。我使用虚拟数据编写的代码用于一个简单、可重现的示例,如下所示:

location <- rep(c("1001", "1002", "1003", "1004"), c(3, 3, 3, 3))
period <- rep(c(2019, 2020, 2021), 4)
change <- c(-3.1, 5.4, -2.2, 190.8, 2.3, 150, 0.34, -0.44, -0.67, 1.2, 3, 4)

tot <- data.frame(location, period, change)


ggplot(data = tot, aes(x = period, y = change)) + 
  geom_bar(stat = "identity", position = "dodge") + coord_flip() +
  facet_wrap(~location, ncol = 1, scales = "free")

...这给了我下图:

显然,这不是很好看。我希望喜欢 0 始终位于图表的中心。我知道我可以通过添加来实现这一点

+ scale_y_continuous(limits = c(-200, 200)

它包含了这个例子中的所有数据,但这给我留下了一个问题,即数据只在 -1 和 1 之间的数据范围内的条形问题,如您所见,它们太小以至于无法区分,特别是在位置 1003:

有没有办法根据 facet 中的数据范围动态设置 facet 的限制?

【问题讨论】:

  • 不要偏离这个问题,但这种做法似乎违反了proper data visualization approaches。由于您使用的是相同的变量,因此通过为不同的设置更改 x 轴的比例,可能看起来设置比看起来更相似。视觉比较中的标准做法是所有面板中的轴保持一致。也许看看相对 (%) 变化?
  • 是相对变化。我接受它可能具有误导性,但我还能如何让小条清晰易读?
  • 如果此处的单位已经以百分比变化表示(不清楚是否属实),那么在不扭曲位置之间关系的感知的情况下清晰呈现结果的另一种方法是将它们分成两个图:一个带有三个(固定 x)面板,用于位置 1001、1002、1004,以及用于 1003 的单独图。

标签: r ggplot2


【解决方案1】:

我同意 cmets,尽管我认为这实现了最初的目标。 Based on this.

library(tidyverse)

location <- rep(c("1001", "1002", "1003", "1004"), c(3, 3, 3, 3))
period <- rep(c(2019, 2020, 2021), 4)
change <- c(-3.1, 5.4, -2.2, 190.8, 2.3, 150, 0.34, -0.44, -0.67, 1.2, 3, 4)

tot <- data.frame(location, period, change)

ggplot(data = tot, aes(x = period, y = change)) +
  geom_blank(aes(y=-change)) +
  geom_bar(stat = "identity", position = "dodge") + 
  coord_flip() +
  facet_wrap(~location, ncol = 1, scales = "free")

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-08-15
    • 2011-04-06
    相关资源
    最近更新 更多