R 自动确定ggplot镶嵌面标签的宽度

R 自动确定ggplot镶嵌面标签的宽度,r,ggplot2,facet,R,Ggplot2,Facet,我有一个实验设计数据,我正在ggplotting与facet\u网格: 试验设计的因素为: factors <- c("mmm.control.30.2","mmm.control.60.2","mmm.control.150.2","mmm.control.300.2","mmm.control.1440.2", "mmm.cxx.30.2","mmm.cxx.60.2","mmm.cxx.150.2","mmm.cxx.300.2","mmm.cxx.1440.2") 因此,data

我有一个实验设计数据,我正在
ggplot
ting与
facet\u网格

试验设计的因素为:

factors <- c("mmm.control.30.2","mmm.control.60.2","mmm.control.150.2","mmm.control.300.2","mmm.control.1440.2",
"mmm.cxx.30.2","mmm.cxx.60.2","mmm.cxx.150.2","mmm.cxx.300.2","mmm.cxx.1440.2")
因此,
data.frame
是:

df <- data.frame(sample=samples,val=rnorm(30),stringsAsFactors = F)
df$replicate <- rep(1:3,10)
df$factor <- factor(gsub("_\\d$","",df$sample,perl=T),levels=factors)
我正在尝试使用以下代码按因子绘制图:

library(ggplot2)
ggplot(df,aes(x=replicate,y=val,color=factor))+
  geom_point(size=3)+facet_grid(~factor,scales="free_x")+
  scale_x_continuous(breaks = integerBreaks())+
theme_minimal()+theme(legend.position="none",axis.title=element_text(size=8))
其中:

正如您所看到的,
facet
标签以及每个
facet
中的左右点都被截断,因为facet标签的宽度与facet数量之间的比率很大

我知道我可以使用
strip.text.x
主题
参数,但我想知道是否有一种自动方法可以使标签适应面内(或将面间隔得更远),并且点不会被切断


我问,因为这是一个通用代码,其中面的数量及其标签会发生变化。也许可以根据刻面的数量和标签的宽度,提出一个函数来近似计算
strip.text.x
的值,但这听起来有点棘手,因此我想知道这是否已经解决了。

如果刻面太长,我会在名称中添加
\n
,将刻面标题分成两行。在你的情况下,这是可以接受的吗?我想这是另一个选项,但它似乎只是用strip.text.x的值来取代了玩的选项,这仍然需要计算标签宽度的面数之间的比率。我想知道是否还有比这更一般的东西。这是真实的还是示例数据?示例中的facet是不必要的,因为每个变量都有一个facet。我不会将replicate绘制为axis变量。看看你的样本名称,它们可能是时间点?如果是这样,我将绘制值与时间的关系图,并按类型(控件或cxx)划分。如果这听起来有帮助的话,我可以提供一个示例答案。嗨@neilfws,我将这个示例扩展到了刻面确实有意义的情况。尽管有样本名称,我对绘制样本与时间轴的关系不感兴趣。如果名称过长,我会通过在名称中添加
\n
将刻面标题拆分为两行。在你的情况下,这是可以接受的吗?我想这是另一个选项,但它似乎只是用strip.text.x的值来取代了玩的选项,这仍然需要计算标签宽度的面数之间的比率。我想知道是否还有比这更一般的东西。这是真实的还是示例数据?示例中的facet是不必要的,因为每个变量都有一个facet。我不会将replicate绘制为axis变量。看看你的样本名称,它们可能是时间点?如果是这样,我将绘制值与时间的关系图,并按类型(控件或cxx)划分。如果这听起来有帮助的话,我可以提供一个示例答案。嗨@neilfws,我将这个示例扩展到了刻面确实有意义的情况。尽管有样本名称,我对绘制样本与时间轴的关系不感兴趣。
integerBreaks <- function(n = 5, ...)
{
  suppressPackageStartupMessages(library(scales))
  breaker <- pretty_breaks(n, ...)
  function(x){
    breaks <- breaker(x)
    breaks[breaks == floor(breaks)]
  }
}
library(ggplot2)
ggplot(df,aes(x=replicate,y=val,color=factor))+
  geom_point(size=3)+facet_grid(~factor,scales="free_x")+
  scale_x_continuous(breaks = integerBreaks())+
theme_minimal()+theme(legend.position="none",axis.title=element_text(size=8))