R 如何以编程方式为ggplot2中的图形指定合适的宽度

R 如何以编程方式为ggplot2中的图形指定合适的宽度,r,ggplot2,R,Ggplot2,在我的R脚本中,我生成了很多带有离散x轴的平面图。有时,我会在x轴上出现重叠标签,我希望避免这种情况: 由于我事先不知道图形将有多大(面数和断点数),因此无法手动将其分配给ggsave 在这种情况下有什么提示或最佳做法吗?这不是一个精确的解决方案,而是一种通常效果良好的做法:您可以旋转轴标签 data(diamonds) diamonds$cut <- paste("Super",as.character(diamonds$cut)) q <- qplot(cut,carat,da

在我的R脚本中,我生成了很多带有离散x轴的平面图。有时,我会在x轴上出现重叠标签,我希望避免这种情况:

由于我事先不知道图形将有多大(面数和断点数),因此无法手动将其分配给ggsave


在这种情况下有什么提示或最佳做法吗?

这不是一个精确的解决方案,而是一种通常效果良好的做法:您可以旋转轴标签

data(diamonds)
diamonds$cut <- paste("Super",as.character(diamonds$cut))
q <- qplot(cut,carat,data=diamonds,geom="boxplot") +
     facet_grid(~color)
library(gridExtra)

grid.arrange(q,
q + theme(axis.text.x = element_text(angle = 90, hjust = 1)))

您可以使用以下功能提取绘图的面数。我已经尝试尽可能的通用,它应该适用于
facet\u网格
facet\u包裹
faceting。然而,我可能忽略了一些可能性。如果是,请留下评论

nfacetcols <- function(p) {
  if (is.null(p$facet$cols) & is.null(p$facet$facets)) return(1)
  # facet_grid - version
  if (! is.null(p$facet$cols)) {
    if (length(p$facet$cols)==0) return(1)
    dat <- p$data[,as.character(p$facet$cols)]
    if (is.factor(dat)) return(nlevels(dat)) 
    if (is.data.frame(dat)) return(nrow(unique(dat)))
    if (is.numeric(dat)) return(length(unique(dat)))
  }
  # facet_wrap - version
  if (! is.null(p$facet$facets)){
    if (!is.null(p$facet$ncol)) return(p$facet$ncol)
    dat <- p$data[,as.character(p$facet$facets)]
    tot <- ifelse(is.factor(dat), nlevels(dat), nrow(unique(dat)))
    if (!is.null(p$facet$nrow)) return(ceiling(tot/p$facet$nrow))
    return(ceiling(sqrt(tot)))
  }
}
然后使用@agstudy的建议,您可以使用以下代码
ggsave
您的绘图:

# create data set
set.seed(123)
N <- 20
df <- data.frame(a = sample(LETTERS[1:10], N, replace=TRUE), 
                 b = sample(letters[1:5], N, replace=TRUE), 
                 yax = rnorm(N), 
                 xax = factor(sample(letters[16:20], N, replace=TRUE)))
# plot
p <- ggplot(df, aes(xax, yax)) + geom_point() + facet_grid(b~a) 
ggsave("eg.plot.png", 
       p + theme(axis.text.x = element_text(angle = 90, hjust = 1)), 
       width=xlvls*nfacetcols(p)/5)
#创建数据集
种子集(123)

N请给出一个可复制的示例。@agstudy您的示例非常好。我注意到在RStudio中绘制(和查看)图形时,标签通常不会重叠。但是,当我在命令行中运行相同的脚本时,会出现重叠。:)我避免提供示例,因为问题不是关于某个特定的图形,而是一般性的问题。如果我的思路是错误的,我很乐意下次提供一个例子。@agstudy Thank,将尝试遵循最佳实践:)我在
主题中使用了第一种方法(axis.text.x=element\u text(angle=45,hjust=1))
,看起来旋转是唯一的方法…@NikolaKnezevic,那么第二种方法呢?正如我在帖子中所写的,我已经使用了刻面,但是我的一些图形有几列(4)。谢谢。我不明白为什么这比旋转标签好?这并不好。但你的问题是“我事先不知道这个图会有多大(面和断点的数量)。”这只是一种找出答案的方法。也许这对储蓄以外的其他目的也有用,所以我想我会分享。。。
xlvls <- nlevels(p$data[,p$labels$x])
# create data set
set.seed(123)
N <- 20
df <- data.frame(a = sample(LETTERS[1:10], N, replace=TRUE), 
                 b = sample(letters[1:5], N, replace=TRUE), 
                 yax = rnorm(N), 
                 xax = factor(sample(letters[16:20], N, replace=TRUE)))
# plot
p <- ggplot(df, aes(xax, yax)) + geom_point() + facet_grid(b~a) 
ggsave("eg.plot.png", 
       p + theme(axis.text.x = element_text(angle = 90, hjust = 1)), 
       width=xlvls*nfacetcols(p)/5)