r - 是否可以指定单个图的大小/布局以匹配 R 中的某个网格?

标签 r ggplot2

我使用 R 进行大部分数据分析。到目前为止,我习惯将结果导出为 CSV 并使用 Macs Numbers 将其可视化。

原因:图表嵌入在文档中,并且右侧有一个相当大的边框保留用于注释(簇状讲义样式)。实际文本和注释列之间有空格。图表的绘制需要适合文本的宽度,而图例应放置在注释栏中。

我更愿意在 R 中创建绘图,以获得更好的工作流程和更高的效率。是否可以使用 R 绘图来创建这样的布局?

这是我想要实现的目标的示例:

result aimed for

这里是一些 R 代码作为入门:

library(tidyverse)

data <- midwest %>% 
  head(5) %>% 
  select(2,23:25) %>%
  pivot_longer(cols=2:4,names_to="Variable", values_to="Percent") %>% 
  mutate(Variable=factor(Variable, levels=c("percbelowpoverty","percchildbelowpovert","percadultpoverty"),ordered=TRUE))


ggplot(data=data, mapping=aes(x=county, y=Percent, fill=Variable)) +
  geom_col(position=position_dodge(width=0.85),width=0.8) + 
  labs(x="County") +
  theme(text=element_text(size=9),
        panel.background = element_rect(fill="white"),
        panel.grid = element_line(color = "black",linetype="solid",size= 0.3),
        panel.grid.minor = element_blank(),
        panel.grid.major.x=element_blank(),
        axis.line.x=element_line(color="black"),
        axis.ticks= element_blank(),
        legend.position = "right",
        legend.title = element_blank(),
        legend.box.spacing = unit(1.5,"cm") ) +
   scale_y_continuous(breaks= seq(from=0, to=50,by=5),
                     limits=c(0,51), 
                     expand=c(0,0)) +
  scale_fill_manual(values = c("#CF232B","#942192","#000000"))

我知道如何设置自定义字体,只是将其保留以方便保存。

使用ggsave

ggsave("Graph_with_R.jpeg",plot=last_plot(),device="jpeg",dpi=300, width=18, height=9, units="cm")

我明白了: enter image description here

这可能会重新采样实际情况下的结果,但布局和尺寸并不完全适合。还可以识别 y 轴上的轴标题、图例和刻度线之间的不同文本大小。此外,我假设图例宽度取决于实际标签并且不是固定的。

更新 根据 tjebo 的建议,我发布了 follow-up question .

最佳答案

可以吗?是的。方便吗?不。 如果您使用 ggplot2,您可以将绘图转换为 gtable,这是绘图规范和实际绘图之间的一种中间形式。然后您可以操作这个 gtable,但使用起来很困惑。

首先,我们需要弄清楚绘图的相关位在 gtable 中的位置。

library(ggplot2)
library(gtable)
library(grid)

plt <- ggplot(mtcars, aes(factor(cyl), fill = factor(vs))) +
  geom_bar(position = position_dodge2(preserve = "single"))

# Making gtable
gt <- ggplotGrob(plt)

gtable_show_layout(gt)

然后,我们可以创建一个具有预先指定尺寸的新 gtable,并将旧 gtable 的位放入其中。

# Making a new gtable
new <- gtable(widths = unit(c(12.5, 1.5, 4), "cm"),
              heights = unit(9, "cm"))

# Adding main panel and axes in first cell
new <- gtable_add_grob(
  new, 
  gt[7:9, 3:5], # If you see the layout above as a matrix, the main bits are in these rows/cols
  t = 1, l = 1
)

# Finding the legend
legend <- gt$grobs[gt$layout$name == "guide-box"][[1]]
legend <- legend$grobs[legend$layout$name == "guides"][[1]]

# Adding legend in third cell
new <- gtable_add_grob(
  new, legend, t = 1, l = 3
)

# Saving as raster
ragg::agg_png("test.png", width = 18, height = 9, units = "cm", res = 300)
grid.newpage(); grid.draw(new)
dev.off()
#> png 
#>   2

reprex package 于 2021 年 4 月 2 日创建(v1.0.0)

enter image description here

创建的图形应符合您要查找的尺寸。

关于r - 是否可以指定单个图的大小/布局以匹配 R 中的某个网格?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66918748/

相关文章:

r - 明确定义变量时,Stan 代码中出现错误

r - 使用ggplot2绘制多边形shapefile和geom_points

r - 更改绘图 geom_polygon、ggplot 的顺序

r - 如何获得位于R中上一行和下一行的值之间的平均值?

r - 选择具有 1 个以上唯一值的列

R、车包无法加载

r - 将方形或三角形标记(不是圆形)添加到 R 绘图 map

r - 在 ggplot2 中使用 FontAwesome 代替点

r - ggplot2 每列的热图

c - R Shiny 下拉问题