r - 为条形图定义一个固定的宽度/高度,然后设置条形的绝对宽度和条形之间的绝对间距,以像素为单位

标签 r ggplot2 bar-chart

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

  • 它们必须具有特定尺寸(宽度和高度)
  • 条的宽度必须固定,以像素为单位,不管图中有多少条
  • 条之间的空间必须固定,以像素为单位,无论条数如何

  • 我与 RStudio 合作,它允许在其查看器中进行响应。这意味着当我扩大查看者的边界时,情节会相应地拉伸(stretch),增加条的宽度和它们之间的空间。相反,使观察者的边界更小会使条更细并减少它们之间的空间。
    类似地,在查看器的给定边界内,绘制条形图会产生 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()
    
    p_all_bars
    
    p_all_bars
    p_two_bars
    
    p_two_bars

    如果我保存 两者 尺寸为 width = 1000 pixels 的绘图和 height = 650 pixels很明显,两个条形宽度 条形之间的空间从一个图(7 个条)到另一个(2 个条)不同。
    all_7

    2_bars
    底线
    如何设置绘图高度和宽度的绝对值(以像素为单位)以及条的宽度和间隔(以像素为单位)——无论绘图中的条数如何?

    最佳答案

    ggplot2 可以很好地缩放以适应不同大小的视口(viewport)的能力是大多数用例的最大 Assets 之一。但是,在这种情况下,您实际上需要在主绘图面板中固定大小的对象,这会使事情变得更加困难。这样做的原因是面板尺寸本身不是固定的。相反,它会根据设备尺寸增大和缩小,从而允许绘图的某些其他元素(例如轴元素、文本和标题)保持固定大小。
    这是可能的,但这并不容易。为此,您需要:

  • 以像素为单位修复整体绘图的大小
  • 将绘图面板的大小固定为总绘图宽度的比例
  • 根据 x 轴上的项目数自动计算条形宽度。

  • 如果您认为这一切听起来太麻烦,那么我可能会同意。如果你想产生很多情节,这是值得的。对于这里或那里的奇数,我可能会沿 x 轴添加虚拟因子级别以保持绘图一致,然后使用成像软件在轴上切除额外的空间。
    但是,这是可能的,因此就其值(value)而言,以下是使用编程方法将条形固定为 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()
    
    twobars.png
    enter image description here

    allbars.png
    enter image description here

    编辑
    另一种方法是使面板保持固定宽度并使用 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)
    }
    
    这允许以下行为:
    mpg %>%
      fixed_bars(class)
    

    
    mpg %>%
      filter(class == "compact" | class == "suv") %>%
      fixed_bars(class)
    

    创建于 2020-12-24 由 reprex package (v0.3.0)

    关于r - 为条形图定义一个固定的宽度/高度,然后设置条形的绝对宽度和条形之间的绝对间距,以像素为单位,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65439901/

    相关文章:

    python - 带有类别的 pyplot 条形图

    r - 如何使用 stargazer 或 xtable 忽略交互?

    read.csv 将空字符列转换为 NA

    R ggplot2 : boxplots with significance level (more than 2 groups: kruskal. 测试和 wilcox.test 成对)和多个方面

    colors - 在条形图中使用打火机自定义颜色

    r - 使用 R base : how to add values inside each stacked bar 的堆叠条形图

    r - 将 gsub 用于 R 中字符串中的特定事件?

    r - ggplot : no sign on y-axis-labels 中的数字格式

    r - ggplot2 条形图,条内有线条

    r - {ggdist }'s stat_interval levels calculate (I thought it was confidence intervals but they' re 不正确)是什么?