ggplot2更改每个单独镶嵌面面板的轴限制 库(tidyverse) ggplot(mpg、aes(显示、cty))+ 几何点() 刻面网格(行=变量(drv),刻度=“自由”)

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(

上面的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()