ggplot2更改每个单独镶嵌面面板的轴限制 库(tidyverse) ggplot(mpg、aes(显示、cty))+ 几何点() 刻面网格(行=变量(drv),刻度=“自由”)
上面的ggplot代码由三个面板组成ggplot2更改每个单独镶嵌面面板的轴限制 库(tidyverse) ggplot(mpg、aes(显示、cty))+ 几何点() 刻面网格(行=变量(drv),刻度=“自由”),r,ggplot2,R,Ggplot2,上面的ggplot代码由三个面板组成4、f和r。我希望每个面板的y轴限制如下: 面板y-min y-max中断 ----- ----- ----- ------ 4 5 25 5 f 0 40 10 r 10202 如何修改代码以实现这一点?不确定scale\u y\u continuous是否更有意义,或者coord\u cartesian,或者两者的某种组合。序言 定义每个面y轴的原始绘图和所需参数: library(ggplot2) g0 <- ggplot(
4
、f
和r
。我希望每个面板的y轴限制如下:
面板y-min y-max中断
----- ----- ----- ------
4 5 25 5
f 0 40 10
r 10202
如何修改代码以实现这一点?不确定scale\u y\u continuous
是否更有意义,或者coord\u cartesian
,或者两者的某种组合。序言
定义每个面y轴的原始绘图和所需参数:
library(ggplot2)
g0 <- ggplot(mpg, aes(displ, cty)) +
geom_point() +
facet_grid(rows = vars(drv), scales = "free")
facet_bounds <- read.table(header=TRUE,
text=
"drv ymin ymax breaks
4 5 25 5
f 0 40 10
r 10 20 2",
stringsAsFactors=FALSE)
将这些添加到绘图中(由于x
为NA
,因此不会绘制它们,但它们仍用于定义比例)
这与expand_limits()
的功能类似,只是该功能适用于“所有面板或所有绘图”
版本2:检测您所在的面板
这是丑陋的,取决于每个群体有一个独特的范围
library(dplyr)
## compute limits for each group
lims <- (mpg
%>% group_by(drv)
%>% summarise(ymin=min(cty),ymax=max(cty))
)
库(dplyr)
##计算每组的限制
lims%分组依据(drv)
%>%总结(ymin=最小值(cty),ymax=最大值(cty))
)
中断功能:找出哪一组对应于给定的限制集
bfun <- function(limits) {
grp <- which(lims$ymin==limits[1] & lims$ymax==limits[2])
bb <- facet_bounds[grp,]
pp <- pretty(c(bb$ymin,bb$ymax),n=bb$breaks)
return(pp)
}
g0 + scale_y_continuous(breaks=bfun, expand=expand_scale(0,0))
bfun这是一个长期存在的功能请求(参见,例如,),由一个单独的包处理
我想用一个带有facetscales的原木秤,但很费劲
事实证明,我必须在两个位置指定log10:
scales_x <- list(
"B" = scale_x_log10(limits=c(0.1, 10), breaks=c(0.1, 1, 10)),
"C" = scale_x_log10(limits=c(0.008, 1), breaks=c(0.01, 0.1, 1)),
"E" = scale_x_log10(limits=c(0.01, 1), breaks=c(0.01, 0.1, 1)),
"R" = scale_x_log10(limits=c(0.01, 1), breaks=c(0.01, 0.1, 1))
)
我认为一般的方法是制作单独的绘图,然后将它们缝合在一起,而不是使用面。关于如何做到这一点的一些想法已经展示出来,我认为你的建议(scale\u y\u continuous
或coord\u cartesian
)都不适用于各个方面。如果这些是数据规模的扩展,我也会通过向数据集中添加虚假数据来实现这一点(并采取一切必要措施确保在定义规模时考虑到这些数据,但不绘制)。也可以使用breaks()
函数通过检测当前正在考虑的子批次来破解此问题…@BenBolker OP正在使用mpg
,这是ggplot2
d'oh!的内置数据集。。。。。。。。。。这个问题可以通过设置scale\u y\u continuous(breaks=my\u breaks,expand=expand\u scale(mult=c(0.1))
来解决,通过my\u break
函数设置breaks和expand\u scale
设置限制。绘制不可见点作为控制比例手段的“更干净”方法可能是使用geom\u blank()
。这应该是现在可以接受的答案。。。尽管Ben Bolker的方法相当聪明,但我认为geom_blank()
可能是一种更灵活的方法,因为facetscales
包似乎不支持facet_wrap
,只支持facet_grid
bfun <- function(limits) {
grp <- which(lims$ymin==limits[1] & lims$ymax==limits[2])
bb <- facet_bounds[grp,]
pp <- pretty(c(bb$ymin,bb$ymax),n=bb$breaks)
return(pp)
}
g0 + scale_y_continuous(breaks=bfun, expand=expand_scale(0,0))
devtools::install_github("zeehio/facetscales")
library(g)
library(facetscales)
scales_y <- list(
`4` = scale_y_continuous(limits = c(5, 25), breaks = seq(5, 25, 5)),
`f` = scale_y_continuous(limits = c(0, 40), breaks = seq(0, 40, 10)),
`r` = scale_y_continuous(limits = c(10, 20), breaks = seq(10, 20, 2))
)
ggplot(mpg, aes(displ, cty)) +
geom_point() +
facet_grid_sc(rows = vars(drv), scales = list(y = scales_y))
library(tidyverse)
facet_params <- read_table("drv y_min y_max breaks
4 5 25 5
f 0 40 10
r 10 20 2")
scales_y <- facet_params %>%
str_glue_data(
"`{drv}` = scale_y_continuous(limits = c({y_min}, {y_max}), ",
"breaks = seq({y_min}, {y_max}, {breaks}))") %>%
str_flatten(", ") %>%
str_c("list(", ., ")") %>%
parse(text = .) %>%
eval()
scales_x <- list(
"B" = scale_x_log10(limits=c(0.1, 10), breaks=c(0.1, 1, 10)),
"C" = scale_x_log10(limits=c(0.008, 1), breaks=c(0.01, 0.1, 1)),
"E" = scale_x_log10(limits=c(0.01, 1), breaks=c(0.01, 0.1, 1)),
"R" = scale_x_log10(limits=c(0.01, 1), breaks=c(0.01, 0.1, 1))
)
ggplot(...) + facet_grid_sc(...) + scale_x_log10()