我正在尝试编写一个脚本,在单个图像中生成四个不同的绘图。具体来说,我想尽可能精确地重新创建这个图形:
我的当前脚本可以生成类似于此的四个绘图,但我无法分配屏幕空间。我希望能够:
生成四个图表并将它们放在一起。
- 修改绘图的高度和宽度,以使所有功能拥有统一的宽度,其中一个比其余的要高得多
- 通过坐标定义图例的位置以有效利用屏幕空间
- 根据需要明确修改图像的整体形状(也许我在某些时候需要更接近正方形的形状)
pt_id = c(1:279) # DEFINE PATIENT IDs
smoke = rbinom(279,1,0.5) # DEFINE SMOKING STATUS
hpv = rbinom(279,1,0.3) # DEFINE HPV STATUS
data = data.frame(pt_id, smoke, hpv) # PRODUCE DATA FRAME
添加解剖部位数据
data$site = sample(1:4, 279, replace = T)
data$site[data$site == 1] = "Hypopharynx"
data$site[data$site == 2] = "Larynx"
data$site[data$site == 3] = "Oral Cavity"
data$site[data$site == 4] = "Oropharynx"
data$site_known = 1 # HACK TO FACILITATE PRODUCING BARPLOTS
添加突变频率数据
data$freq = sample(1:1000, 279, replace = F)
定义条形图
require(ggplot2)
require(gridExtra)
bar = ggplot(data, aes(x = pt_id, y = freq)) + geom_bar(stat = "identity") + theme(axis.title.x = element_blank(), axis.ticks.x = element_blank(), axis.text.x = element_blank()) + ylab("Number of Mutations")
# DEFINE BINARY PLOTS
smoke_status = ggplot(data, aes(x=pt_id, y=smoke, fill = "red")) + geom_bar(stat="identity") + theme(legend.position = "none", axis.title.x = element_blank(), axis.ticks.x = element_blank(), axis.text.x = element_blank()) + ylab("Smoking Status")
hpv_status = ggplot(data, aes(x=pt_id, y = hpv, fill = "red")) + geom_bar(stat="identity") + theme(legend.position = "none", axis.title.x = element_blank(), axis.ticks.x = element_blank(), axis.text.x = element_blank()) + ylab("HPV Status")
site_status = ggplot(data, aes(x=pt_id, y=site_known, fill = site)) + geom_bar(stat="identity")
生成四个图表并将它们放在一起。
grid.arrange(bar, smoke_status, hpv_status, site_status, nrow = 4)
我怀疑实现这些任务所需的函数已经包含在ggplot2和gridExtra中,但我还没有找到如何使用它们。如果我的代码过于冗长,或者有更简单、更优雅的方法来完成我已经完成的工作,请随时评论。
ggplot_build
和ggplot_gtable
以将绘图分解为组件grobs,然后您可能需要构建自己的布局(grid.layout
),并在特定的视口中绘制每个grob。请注意,不要改变原文意思。 - jorangtable
wiki。 - Henrik