问题描述
我正在创建一个分为多个方面的图表。其中一些方面需要在较小的范围内进行,以便更好地查看。我已经应用了几个技巧来实现这一点。但是,我需要更改某些方面的轴的限制和划分。
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_wrap
与 scales = "free"
一起使用,但我真正想要的是能够修改 "First"
行中小平面 x 轴的限制和划分。
#plot using facet wrap
p + facet_wrap(Range~Source,scales = "free") +
ggtitle("Using facet_wrap")
所以我选择使用 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
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 日创建