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

2023-12-05

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

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

我使用 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()
p_all_bars

p_all_bars

p_two_bars

p_two_bars


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

all_7


2_bars

底线

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


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

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

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

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

然而,它is可能,所以就其价值而言,这里是一个使用编程方法将条形固定为 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()

两栏.png

enter image description here


所有栏.png

enter image description here


EDIT

另一种方法是将面板保持固定宽度并使用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)

Created on 2020-12-24 by the reprex package (v0.3.0)

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

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

  • R:使用 dcast 时包含没有条目的因子

    我在数据帧上使用 reshape2 函数 dcast 其中一个变量是某些级别未出现在数据框中的因素 但我会将所有值包含在创建的新列中 例如 假设我运行以下命令 library reshape2 dataDF lt data frame id
  • 替换为 NA

    我有一个包含条目的数据框 看来这些值没有被视为 NA 因为 is na 返回 FALSE 我想将这些值转换为 NA 但找不到方法 Use dfr dfr
  • 为 PDF 输出添加 natbib 选项

    有没有办法指定natibib输出 PDF 时的选项bookdown 我希望 tex 输出具有命令 usepackage sort compress natbib 但似乎没有任何方法可以在 YAML 中指定它 我无法将命令添加到我的序言中 因
  • 什么是 data.frame 可以做而 data.table 不能做的事情?

    我刚刚开始使用 R 并遇到了 data table 我发现它很棒 一个非常天真的问题 我可以忽略 data frame 来使用 data table 以避免两个包之间的语法混淆吗 来自数据表常见问题解答 http datatable r f
  • 匹配向量内的向量

    I have vec1 lt c 0 0 0 1 1 0 1 1 1 0 0 1 vec2 lt c 1 1 我预计 magicFUN x vec1 y vec2 1 4 7 8 这意味着我想要一个完整向量在另一个向量内的位置 match
  • R 在 Ubuntu 中通过代理连接

    我在 Ubuntu 12 04 上安装了 RStudio 0 97 168 当我尝试安装 gstat 库时出现以下错误 install packages gstat dependencies TRUE Warning in install
  • 为闪亮的应用程序创建桌面图标

    当我在基本 R 提示中提供以下代码时 我会在浏览器中打开一个闪亮的应用程序 shiny runApp C Myapp 我使用 Windows 7 我试图创建一个桌面图标 以避免我的客户每次想要使用该应用程序时都键入上述代码 我创建了一个桌面
  • 两个闪亮的操作按钮

    我正在编写一个闪亮的函数 其中包含两个操作按钮 这两个按钮是左右按钮 单击时可以帮助绘图移动 第一次单击时 这两个按钮都工作正常 当我重新单击它们时 就会出现问题 无论我单击哪个按钮 它都会在两个范围之间来回弹跳 我猜可能是 右 和 左 按
  • R Plotly 禁用图例单击和图例双击

    我想使用 R Plotly 从服务器端禁用绘图图例选择 我们看here https community plot ly t disable legend click functionality hiding traces 1345 2可以使
  • 使用 dplyr 按组计算加权平均值(并复制其他方法)

    我对语法感到困惑dplyr当尝试计算加权平均值时 我听从大卫的建议here https stackoverflow com a 27609266 1457380 语法非常透明 因此很有吸引力 但它似乎没有按我的预期工作 低于加权平均值是针对
  • R 中整数向量的大小

    我原以为 R 有一个用于存储对象的标准开销 看起来是 24 字节 至少对于整数向量而言 但一个简单的测试表明它比我意识到的要复杂 例如 采用长度为 100 的整数向量 使用随机采样 希望避免任何可能存在的偷偷摸摸的序列压缩技巧 https
  • 根据感兴趣的特定单词绘制高度相关的单词[关闭]

    Closed 这个问题需要细节或清晰度 help closed questions 目前不接受答案 我正在尝试绘制一个单词的最高相关性 例如 我想绘制 鲸鱼 一词的最高十个相关性的图表 有人可以帮我执行类似的命令吗 如果有帮助的话我已经安装
  • 如何连接 R 列表中的多个 .wav 文件?

    我有一个 wav 文件列表my list library seewave library tuneR data tico audio lt tico freq lt 22050 breaks lt c 0 0 2 0 4 0 6 0 8 i
  • 根据第二个数据帧中的匹配创建新列

    如果有两个数据框 top3df http dpaste com 1709875 and qw qw lt structure list id structure 1 25 Label c w01 w02 w03 w04 w05 w06 w0
  • ggplot2:图例中的斜体

    我正在尝试编辑图例中的标签 以便第一个标签 WT 为纯文本 而后续 7 个标签为斜体 我一直在使用element text face c plain rep italic 7 但这导致没有任何标签被转换为斜体 我有点困惑为什么它不起作用 因
  • R/ggplot2:如何匹配重叠区域图中的图例和绘图颜色?

    我有两个面积图 称为 蓝色 和 绿色 其中green大部分是在blue情节 但在极少数点上 它高于blue阴谋 我想使用透明度说alpha 0 2对于两者 并且还能够为每个指定颜色 我现在的问题是 自从green情节主要是在blue地块 其
  • 生成与现有变量具有预定义相关性的二进制变量

    对于模拟研究 我想生成一组随机变量 连续变量和二元变量 这些变量与已经存在的变量具有预定义的关联binary变量 此处表示为x 对于这篇文章 假设x是按照下面的代码生成的 但请记住 在现实生活中 x是一个已经存在的变量 set seed 1
  • 动态显示仪表板页面

    我有一个实用的闪亮应用程序 它使用shinydashboard包裹 新功能需要特定于用户的行为 例如 针对不同的用户名使用不同的数据集 因此我打算 显示登录表单 验证凭据并设置反应值LoggedIn to true如果成功的话 显示实际情况
  • 使用 ggplot2 在一张画布上绘制多个图形[重复]

    这个问题在这里已经有答案了 我正在尝试根据此表将两个 ggplot2 图合并为一个图 Type RatingA RatingB 1 One 3 36 2 Two 5 53 3 One 5 57 4 One 7 74 5 Three 4 38
  • 用于检查和批量线性模型的数据表选项

    我想知道是否有data table用于从数据集中批量处理线性模型并首先进行检查的选项 我需要对每个唯一标识符运行一堆线性模型 但首先我需要进行检查 对于每个唯一的 id 和年份 我需要检查是否有至少 24 个月的先前每月数据 但不超过 60

随机推荐