如何使用ggplot2更改每个方面的轴的限制和划分?处理“x$clone() 尝试应用非函数时出错”

问题描述

我正在创建一个分为多个方面的图表。其中一些方面需要在较小的范围内进行,以便更好地查看。我已经应用了几个技巧来实现这一点。但是,我需要更改某些方面的轴的限制和划分。

调用必要的包,创建数据库并制作绘图

devtools::install_github("zeehio/facetscales")
library(ggplot2)
library(facetscales)

#Constructing data frame
Source <- c(rep("Water",12),rep("Oil",12))
Range <- rep((c(rep("First",4),rep("Second",8))),2)
Xaxis <- c(0,1,2,5,10,20,30,40,40)
Yaxis <- c(0,40)

DF <- data.frame(Source,Range,Xaxis,Yaxis)
      
#plot
p <- ggplot(data = DF,aes(x = Xaxis,y = Yaxis)) +
  geom_smooth(method = "lm",formula = y ~ x) +
  geom_point()

我最初将 facet_wrapscales = "free" 一起使用,但我真正想要的是能够修改 "First" 行中小平面 x 轴的限制和划分。

#plot using facet wrap
p + facet_wrap(Range~Source,scales = "free") +
  ggtitle("Using facet_wrap")

enter image description here

所以我选择使用 facetscales 包并遵循 this (1)this (2) 示例

#axis specifications
scale_x <- list(
  "First" = scale_x_continuous(limits = c(0,10),breaks = c(0,10)),"Second"= scale_x_continuous(limits = c(0,40),40))
)

#plot using facet grid and the facetscales package
p + facet_grid_sc(rows = vars(Range),cols = vars (Source),scales = list(x = scale_x)) +
  ggtitle("Using facet_grid_sc")

当尝试使用我需要的规格制作图表时:

error in x$clone() attempt to apply non-function

我不明白我做错了什么。有人可以帮我吗?

解决方法

我想我找到了它不起作用的原因,

facet_grid 中,scales 参数用于指示每个面板是否具有与 c("free","free_x","free_y") 相似或不同的比例。但是 free_x 上的 facet_grid 仅在水平方向上是自由的,并且所有垂直分组具有相同的比例范围。

指定facet_grid_sc时,scales参数用于区分每个比例将如何呈现,特别是scales = list(x = scale_x),其中scale_x匹配cols = vars(Range)

library(ggplot2)
library(facetscales)

#Constructing data frame
Source <- c(rep("Water",12),rep("Oil",12))
Range <- rep((c(rep("First",4),rep("Second",8))),2)
Xaxis <- c(0,1,2,5,10,20,30,40,40)
Yaxis <- c(0,40)

DF <- data.frame(Source,Range,Xaxis,Yaxis)

p <- ggplot(data = DF,aes(x = Xaxis,y = Yaxis)) +
  geom_smooth(method = "lm",formula = y ~ x) +
  geom_point()

#old plot without facet_grid_sc
p + facet_grid(rows = vars(Range),cols = vars (Source))

您看到如果在行上按 Range 分面,它们会被垂直分割而不是水平分割吗?我不认为 facet_grid_sc 支持 free_x 同时还指定 scales

的 x 元素
scale_x <- list(
  First = scale_x_continuous(limits = c(0,10),breaks = c(0,10)),Second= scale_x_continuous(limits = c(0,40),40))
)

#new plot where scale_x matches cols argument
p + facet_grid_sc(cols = vars(Range),rows = vars (Source),scales = list(x = scale_x))

reprex package (v1.0.0) 于 2021 年 3 月 16 日创建


编辑

应该注意的是,如果您想单独控制每个面板列/行的范围或标签,facet_grid_sc 可能更有用。在本例中,在 scales = "free_x" 中使用 facet_grid 实际上已经足够了。


p + facet_grid(cols = vars(Range),scales = "free_x")

reprex package (v1.0.0) 于 2021 年 3 月 16 日创建