2013-12-09 36 views
3

我在R腳本內部生成了具有離散x軸的很多分面圖。有時候,我得到的x軸重疊標籤的方式,我想避免:如何以編程方式爲ggplot2中的圖形分配好寬度

ggsave overlaps

因爲我不可能提前知道你有多大的圖形將是(面和休息的數),我無法手動將其分配給ggsave。

這種情況下的任何提示或最佳做法?

+1

請給一個可重複例。 – agstudy

+0

@agstudy你的例子很不錯。 –

+0

我注意到當在RStudio中繪製(和查看)圖形時,標籤通常不會重疊。但是,當我在命令行中運行相同的腳本時,會出現重疊。 –

回答

2

不是一個確切的解決方案,而是一個通常效果很好的實踐:您可以旋轉軸標籤。

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))) 

enter image description here

第二溶液

使用facet_wrap與一個塔(1或幾列)

qplot(cut,carat,data=diamonds,geom="boxplot") + 
    facet_wrap(~color,ncol=1) 

enter image description here

+0

我正在使用第一種方法與主題(axis.text.x = element_text(angle = 45,hjust = 1)))',似乎輪換是唯一的方法... –

+0

@NikolaKnezevic和第二種方法呢? – agstudy

+0

正如我在帖子中寫到的,我已經使用了faceting,但是我的一些圖有幾列(4)。 –

0

可以提取數具有以下功能的劇情方面。我儘量做到儘可能一般,它應該適用於facet_gridfacet_wrap刻面。然而,我忽略了一些可能性。如果是這樣,請發表評論。

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))) 
    } 
} 

使用此功能,可以提取列數。可以很容易地使用

xlvls <- nlevels(p$data[,p$labels$x]) 

然後使用@agstudy的建議中提取的α-因子x的級別數,您可以使用下面的代碼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) 
+0

謝謝。我不明白爲什麼這比只旋轉標籤更好? –

+0

這不是更好。但是你的問題提到:「我不知道圖表會有多大(面數和中斷)」。這只是一個發現的方法。也許這對於儲蓄以外的其他目的也是有用的,所以我想我會分享...... – shadow

相關問題