为条形图定义固定宽度/高度,然后设置条形图的绝对宽度以及条形图之间的绝对间距(以像素为单位)

Emm*_*man 5 r bar-chart ggplot2

我想使用它生成条形图,ggplot2它将遵循严格的标准:

  • 它们必须具有一定的尺寸(宽度和高度)
  • 条形的宽度必须固定(以像素为单位),无论图中有多少条形
  • 无论条形数量多少,条形之间的间距必须固定(以像素为单位)

我使用 RStudio,它允许其查看器具有响应能力。这意味着当我扩大观看者的边界时,绘图也会相应拉伸,增加条形的宽度和条形之间的间距。相反,缩小观察者的边界将使条形变细并减少条形之间的空间。

类似地,在给定的查看器边界内,绘制条形图将产生 6 个条形与仅 2 个条形不同的条形宽度。

示范

library(ggplot2)
library(dplyr)

p_all_bars <- 
  mpg %>%
  ggplot(aes(x = class)) +
  geom_bar()

p_two_bars <-
  mpg %>%
  filter(class == "compact" | class == "suv") %>%
  ggplot(aes(x = class)) +
  geom_bar()
Run Code Online (Sandbox Code Playgroud)
p_all_bars
Run Code Online (Sandbox Code Playgroud)

p_all_bars

p_two_bars
Run Code Online (Sandbox Code Playgroud)

p_two_bars


如果我保存尺寸为 的两个width = 1000 pixels图,height = 650 pixels很明显,一个图(7 个条)与另一个图(2 个条)的条形宽度条形之间的间距都不同。

全部_7


2_条

底线

如何设置图的高度和宽度(以像素为单位)以及条形的宽度和条形之间的间距(以像素为单位)的绝对值 - 无论图中的条形数量如何?

All*_*ron 2

对于大多数用例来说,ggplot2 能够很好地缩放以适应不同大小的视口,这是其最大的资产之一。然而,在这种情况下,您实际上希望主绘图面板中的对象大小固定,这会让生活变得更加困难。其原因是面板尺寸本身不固定。相反,它根据设备尺寸增大和缩小,从而允许绘图的某些其他元素(例如轴元素、文本和标题)保持固定尺寸。

这是可能的,但这并不容易。为此,您需要:

  1. 修复整个图的大小(以像素为单位)
  2. 将绘图面板的大小固定为总绘图宽度的比例
  3. 根据 x 轴上的项目数量自动计算条形宽度。

如果您认为这一切听起来太麻烦,那么我可能会同意。如果你想制作很多情节,这是值得做的。对于这里或那里的奇怪情况,我可能会沿 x 轴添加虚拟因子水平以保持绘图一致,然后使用成像软件剪掉轴上的额外空间。

然而,这可能的,所以就其价值而言,这里有一个使用编程方法将条形固定为 51 像素宽、6 像素间隙的示例:

library(ggplot2)
library(dplyr)

p_all_bars <- 
  mpg %>%
  ggplot(aes(x = class)) +
  geom_bar() +
  scale_x_discrete(expand = expansion(0, 1/7))

p_two_bars <-
  mpg %>%
  filter(class == "compact" | class == "suv") %>%
  ggplot(aes(x = class)) +
  geom_bar() +
  scale_x_discrete(expand = expansion(mult = 0, 1/2))

two_bars <- ggplot_gtable(ggplot_build(p_two_bars))
all_bars <- ggplot_gtable(ggplot_build(p_all_bars))

all_bars$widths[5] <- unit(14, "cm")
all_bars$widths[1] <- unit(1, "null")
two_bars$widths[5] <- unit(4, "cm")
two_bars$widths[1] <- unit(1, "null")

png("twobars.png", width = 500, height = 500)
plot(two_bars)
dev.off()

png("allbars.png", width = 500, height = 500)
plot(all_bars)
dev.off()
Run Code Online (Sandbox Code Playgroud)

两栏.png

在此输入图像描述


所有栏.png

在此输入图像描述


编辑

另一种方法是使面板保持固定宽度并用于coord_cartesian保持条宽度恒定。

取以下函数:

library(ggplot2)
library(dplyr)

fixed_bars <- function(data, var, ncols = 6) {
  ncols   <- ncols + 2
  data    <- mutate(data, {{var}} := as.factor({{var}}))
  levs    <- length(levels(pull(data, {{var}})))
  extra   <- ncols - levs
  x_range <- range(as.numeric(pull(data, {{var}}))) + c(-0.5, 0.5) * extra

  ggplot(data, aes(x = {{var}})) +
    geom_bar() +
    coord_cartesian(xlim = x_range)
}
Run Code Online (Sandbox Code Playgroud)

这允许以下行为:

mpg %>%
  fixed_bars(class)
Run Code Online (Sandbox Code Playgroud)


mpg %>%
  filter(class == "compact" | class == "suv") %>%
  fixed_bars(class)
Run Code Online (Sandbox Code Playgroud)

由reprex 包(v0.3.0)于 2020 年 12 月 24 日创建