首页 > 解决方案 > 如何确保 ggplot2 中具有离散变量的图之间的轴长度一致?

问题描述

我一直在尝试标准化多个条形图,以使条形的宽度都相同,而与条形的数量无关。请注意,这是在多个不同的图上 - 刻面不是一种选择。缩放绘图区域很容易,例如,具有 6 个条形图的绘图宽度是具有 4 个柱形图的宽度的 1.5*。这将完美地工作,除了默认情况下每个图都有一个扩展的 x 轴,我想保留它。

“默认设置是连续变量每边扩大 5%,离散变量每边扩大 0.6 个单位。” https://ggplot2.tidyverse.org/reference/scale_discrete.html

我的问题是我一生都无法弄清楚“0.6 个单位”的实际含义。我已经在各种设计工具中手动测量了条形和 y 轴之间的距离并得到了不一致的答案,因此在计算面板窗口的大小时,我无法将“0.6 个单位”计入我的计算中。此外,我无法找到关于离散 x 轴长多少“单位”的任何答案——我起初假设每个类别有 1 个单位,但这根本不符合视觉效果。我附上了一张图片,希望能说明我的意思——两张图

在此图像中,顶部图形的绘图区域正好是底部图形的 1.5*。看到它有 6 个条与 4 个相比,这意味着每个条具有相同的宽度,除了轴和第一个条之间的额外空间将其弄乱。设置expand = expansion(add = c(0, 0))可以清除这一点,但会导致图表不那么漂亮。我想要的是两个地块之间的条形宽度相同,从而解决了这个额外的空间。我正在专门寻找可用于未来绘图的通用解决方案,而不是用于此示例的单独解决方案。因此,我真正想知道的是这两个 x 轴有多少个“单位”?非常感谢您的帮助!

标签: rggplot2

解决方案


我可能不会使用轴的扩展,而是使用分类变量实际上绘制在笛卡尔坐标上的正整数上的事实。这意味着,如果您知道要在绘图中使用的最大列数,您可以将其设置为coord_cartesian. 保持条形居中涉及一些算术,但它应该给出一致的结果。

我们从一些可重现的数据开始:

library(ggplot2)

set.seed(1)

df <- data.frame(group = letters[1:6], value = 100 * runif(6))

现在我们设置我们需要的最大柱数的值:

MAX_BARS <- 6

关于绘图代码的唯一“有趣”是计算 x 轴限制coord_cartesian

ggplot(df, aes(group, value)) + 
  geom_col() +
  coord_cartesian(xlim = c(1 -(MAX_BARS - length(unique(df$group)))/2,
                           MAX_BARS - (MAX_BARS - length(unique(df$group)))/2))

现在让我们删除一个因子水平并运行完全相同的绘图代码:

df <- df[-1,]

ggplot(df, aes(group, value)) + 
  geom_col() +
  coord_cartesian(xlim = c(1 -(MAX_BARS - length(unique(df$group)))/2,
                           MAX_BARS - (MAX_BARS - length(unique(df$group)))/2))

然后再次:

df <- df[-1,]

ggplot(df, aes(group, value)) + 
  geom_col() +
  coord_cartesian(xlim = c(1 -(MAX_BARS - length(unique(df$group)))/2,
                           MAX_BARS - (MAX_BARS - length(unique(df$group)))/2))

然后再次:

df <- df[-1,]

ggplot(df, aes(group, value)) + 
  geom_col() +
  coord_cartesian(xlim = c(1 -(MAX_BARS - length(unique(df$group)))/2,
                           MAX_BARS - (MAX_BARS - length(unique(df$group)))/2))

您将看到条形保持恒定宽度和集中,但面板尺寸保持固定。

reprex 包于 2021-11-06 创建 (v2.0.0 )


推荐阅读