我使用 R 进行大部分数据分析。到目前为止,我习惯将结果导出为 CSV 并使用 Macs Numbers 将其可视化。
原因:图表嵌入在文档中,并且右侧有一个相当大的边框保留用于注释(簇状讲义样式)。实际文本和注释列之间有空格。图表的绘制需要适合文本的宽度,而图例应放置在注释栏中。
我更愿意在 R 中创建绘图,以获得更好的工作流程和更高的效率。是否可以使用 R 绘图来创建这样的布局?
这是我想要实现的目标的示例:
这里是一些 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")
这可能会重新采样实际情况下的结果,但布局和尺寸并不完全适合。还可以识别 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)
创建的图形应符合您要查找的尺寸。
关于r - 是否可以指定单个图的大小/布局以匹配 R 中的某个网格?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66918748/