gpt4 book ai didi

r - 避免分面ggplots中的轴刻度标签冲突

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

在多面板/多面图中,我喜欢将面板挤压在一起而它们之间没有空间是可行的,例如使用 theme(panel.spacing=grid::unit(0,"lines")) (爱德华·塔夫特(Edward Tufte)说这很好,因为面板间的空间会产生分散注意力的视觉效果,而且会浪费数据空间,我喝过这种特别的 Kool-Aid。)

问题在于,根据分面行/列中值的精确范围,相邻分面的轴标签可能会重叠。例如,在此图中,顶部面板中的底部刻度标签与中间面板中的顶部刻度标签之间存在碰撞。

dd <- data.frame(x=rep(1:3,3),
y=c(0.1,0.2,0.3,
0.1,0.4,0.6,
1,2,3),
f=factor(rep(letters[1:3],each=3)))
library(ggplot2)
ggplot(dd,aes(x,y))+
facet_grid(f~.,scale="free")+
geom_point()+
theme_bw(base_size=24)+
theme(panel.spacing=grid::unit(0,"lines"))
ggsave("tmp1.png",width=4,height=6)

enter image description here

我想为这个问题构建一个通用的、方便的解决方案 - 将每个方面的限制扩展适当的数量(每个方面都会有所不同,因为范围是异构的)但抑制(至少)标签和(可能)勾号标记为极值。我过去通过设置一个特殊用途以一种 super 黑客的方式完成了此操作 breaks内函数 scale_y_continuous .我可能已经想到了一些其他方法来做到这一点(如果我可以让它们工作,我会将它们作为答案发布),但我正在寻找(a)相当强大的通用函数来指定 labels和/或 breaks .

这与 Automate tick max and min in faceted ggplot 不一样,它只需要按方面的最大值/最小值。

这通常很难做到,并且可能无法完全解决;我想过只消去极端标签,但如果只有两个或三个刻度标签,那将失败。可能有一个解决方案 expand_limits() ,但这很难跨方面做到......

最佳答案

编辑 更新到 ggplot2 版本 3.0.0

一种可能性可能是修改构建数据。可以采用原始图的限制,并应用乘法扩展因子。主要和次要中断的相对位置也需要调整。请注意,该功能允许选择要应用扩展的面板。

这和使用 expand 有什么区别?内scale_y_continuous (除了能够选择面板)?此功能保留原始中断(以及刻度线和网格线)。只是它们占用的空间更少。 expand ,但是,会压缩比例,但 ggplot 会添加新标签、网格线和刻度线(如果可以)。

打破这个功能并不需要太多 - 众所周知,ggplot 在最近的版本中会更改构建数据元素的名称。

dd <- data.frame(x=rep(1:3,3),
y=c(0.1,0.2,0.3,
0.1,0.4,0.6,
1,2,3),
f=factor(rep(letters[1:3],each=3)))
library(ggplot2)


p = ggplot(dd,aes(x,y))+
facet_grid(f~.,scale="free")+
geom_point()+
theme_bw(base_size=24)+
theme(panel.spacing=grid::unit(0,"lines"))


expand = function(plot, mult = 0.1, applyTo) {
# Get the build data
gd = ggplot_build(plot)

# Get the original limits,
# and calculate the new limits,
# expanded according to the multiplicative factor
limits <- sapply(gd$layout$panel_params, "[[", "y.range") # Original limits
fac = mult*(limits[2,] - limits[1, ])
newlimits = rbind(limits[1, ] - fac, limits[2, ] + fac)

# The range for the new limits
range = newlimits[2, ] - newlimits[1, ]

# Calculate the new y.major and y.minor relative positions
# and put them along with the new limits back into the build data

N = dim(gd$layout$panel_params)[1] # Number of panels

for(i in applyTo) {
y.major = (gd$layout$panel_params[[i]]$y.major_source - newlimits[1, i]) / range[i]
y.minor = (gd$layout$panel_params[[i]]$y.minor_source - newlimits[1, i]) / range[i]

gd$layout$panel_params[[i]]$y.range = newlimits[, i]

gd$layout$panel_params[[i]]$y.major = y.major
gd$layout$panel_params[[i]]$y.minor = y.minor
}

# Get the gtable
ggplot_gtable(gd)
}


# Plot it
grid::grid.draw(expand(p, mult = 0.1, applyTo = 1:2))

原装
enter image description here

修改
enter image description here

关于r - 避免分面ggplots中的轴刻度标签冲突,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41575045/

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