我在R腳本內部生成了具有離散x軸的很多分面圖。有時候,我得到的x軸重疊標籤的方式,我想避免:如何以編程方式爲ggplot2中的圖形分配好寬度
因爲我不可能提前知道你有多大的圖形將是(面和休息的數),我無法手動將其分配給ggsave。
這種情況下的任何提示或最佳做法?
我在R腳本內部生成了具有離散x軸的很多分面圖。有時候,我得到的x軸重疊標籤的方式,我想避免:如何以編程方式爲ggplot2中的圖形分配好寬度
因爲我不可能提前知道你有多大的圖形將是(面和休息的數),我無法手動將其分配給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_wrap
與一個塔(1或幾列)
qplot(cut,carat,data=diamonds,geom="boxplot") +
facet_wrap(~color,ncol=1)
我正在使用第一種方法與主題(axis.text.x = element_text(angle = 45,hjust = 1)))',似乎輪換是唯一的方法... –
@NikolaKnezevic和第二種方法呢? – agstudy
正如我在帖子中寫到的,我已經使用了faceting,但是我的一些圖有幾列(4)。 –
可以提取數具有以下功能的劇情方面。我儘量做到儘可能一般,它應該適用於facet_grid
和facet_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)
謝謝。我不明白爲什麼這比只旋轉標籤更好? –
這不是更好。但是你的問題提到:「我不知道圖表會有多大(面數和中斷)」。這只是一個發現的方法。也許這對於儲蓄以外的其他目的也是有用的,所以我想我會分享...... – shadow
請給一個可重複例。 – agstudy
@agstudy你的例子很不錯。 –
我注意到當在RStudio中繪製(和查看)圖形時,標籤通常不會重疊。但是,當我在命令行中運行相同的腳本時,會出現重疊。 –