gpt4 book ai didi

R ggplot2 facetting 保持比率但覆盖/定义输出绘图大小

转载 作者:行者123 更新时间:2023-12-04 15:12:02 26 4
gpt4 key购买 nike

我目前正在使用 ggplot2 来比较来自不同组的统计数据,每个组都属于不同的区域。这是通过运行 R 脚本的 Web 应用程序(tikiwiki CMS + 插件 R)完成的。每个区域我可以有 2 到 30 个或更多组。对唯一网页中的所有数据运行相同的 R 脚本,结果根据所选区域进行调整 - 作为页面的参数。

目前,我有这个:

region 1: 12 groups = 12 medium facets
region 2: 3 groups = 3 **HUGE** facets
region 3: 24 groups = 24 **TINY** facets
region 4: 16 groups = 16 medium facets
...

区域 2

Less Groups

区域 3

More groups

我想要什么样的结果是:

区域 2

enter image description here

区域 3
保持不变

我使用 facet_wrap(~data, ncol=4) 对每组进行分面,因此我可以拥有 2 或 30 多个方面。我的问题是输出:要么把 30 个面塞进一个小盒子里,要么两个面在同一个盒子里过大 -> 见上面的图片......我找不到如何修复比例(或图像输出最大宽度)但保持最终图片大小自由。

是否可以在 ggplot2/R 中修复刻面的默认大小并使生成的图片的大小适应刻面的数量?

如果这在 ggplot2/R 中是不可能的,是否有任何 javascript/jquery 库可以获取代码并正确显示结果(d3,...)?

最佳答案

您可以编辑 gtable 将高度设置为物理单位(例如厘米)而不是相对(“空”)

require(ggplot2)
p = qplot(Sepal.Width, Sepal.Length, data=iris) + facet_wrap(~Species, ncol=1)
g = ggplotGrob(p)

panels = which(sapply(g[["heights"]], "attr", "unit") == "null")
g[["heights"]][panels] = list(unit(4, "cm"), unit(8, "cm"), unit(2, "cm"))

device.height = convertHeight(sum(g[["heights"]]), "in", valueOnly=TRUE)

pdf("test.pdf", height = device.height)
grid.draw(g)
dev.off()

enter image description here

编辑 作为后续,这里有一个将所有面板的高度和宽度设置为固定值的功能,
freeze_panels <- function(p, draw=TRUE,
width=unit(5,"cm"),
height=unit(1,"in")){
require(grid)
g <- ggplotGrob(p)

vertical_panels <-which(sapply(g[["heights"]], "attr", "unit") == "null")
horizontal_panels <-which(sapply(g[["widths"]], "attr", "unit") == "null")

g[["heights"]][vertical_panels] <- replicate(length(vertical_panels),
height, simplify=FALSE)

g[["widths"]][horizontal_panels] <- replicate(length(horizontal_panels),
width, simplify=FALSE)

device.height <- convertHeight(sum(g[["heights"]]), "in", valueOnly=TRUE)
device.width <- convertWidth(sum(g[["widths"]]), "in", valueOnly=TRUE)
if(draw){
dev.new(height=device.height, width=device.width)
grid.newpage()
grid.draw(g)
}
invisible(g)
}



require(ggplot2)
d1 <- subset(mtcars, carb != 8)
d2 <- subset(mtcars, carb %in% c(1,2,3))
p = qplot(vs, am, data=d1) + facet_wrap(~carb)

freeze_panels(p)
freeze_panels(p %+% d2)
freeze_panels(p %+% d2 + facet_wrap(~carb, ncol=1))

关于R ggplot2 facetting 保持比率但覆盖/定义输出绘图大小,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19357668/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com