facet_wrap
またはfacet_grid
呼び出しでストリップ ラベル テキストを動的にラップする方法を探しています。を使用してこれを達成する方法を見つけましたが、出力strwrap
が必要に応じて機能するように を指定する必要がありますwidth
。多くの場合、ファセットの数は事前にわからないため、この方法ではwidth
、データセットとプロット サイズに基づいてパラメーターを繰り返し調整する必要があります。ラップ機能の幅を動的に指定することは可能ですか? または、より適切に機能するファセットにラベルを付けるための別のオプションはありますか?
library(ggplot2)
df = expand.grid(group=paste(c("Very Very Very Long Group Name "), 1:9),
x=rnorm(5), y=rnorm(5), stringsAsFactors=FALSE)
df$groupwrap = unlist(lapply(strwrap(df$group, width=30, simplify=FALSE), paste,
collapse="\n"))
p = ggplot(df) +
geom_point(aes(x=x, y=y)) +
facet_wrap(~groupwrap)
更新: @baptiste と @thunk によって提供されたガイダンスに基づいて、以下のオプションを思いつきました。現在、特定のフォント ファミリとサイズでのみ機能しますが、理想的には、デフォルトtheme
設定も使用できるようにする必要があります。たぶん、よりggplot2
経験のある人が改善のためのいくつかの提案を持っています。
library('grid')
grobs <- ggplotGrob(p)
sum = sum(sapply(grobs$width, function(x) convertWidth(x, "in")))
panels_width = par("din")[1] - sum # inches
df$group = as.factor(df$group)
npanels = nlevels(df$group)
if (class(p$facet)[1] == "wrap") {
cols = n2mfrow(npanels)[1]
} else {
cols = npanels
}
ps = 12
family = "sans"
pad = 0.01 # inches
panel_width = panels_width / cols
char_width = strwidth(levels(df$group)[
which.max(nchar(levels(df$group)))], units="inches", cex=ps / par("ps"),
family=family) / max(nchar(levels(df$group)))
width = floor((panel_width - pad)/ char_width) # characters
df$groupwrap = unlist(lapply(strwrap(df$group, width=width, simplify=FALSE),
paste, collapse="\n"))
ggplot(df) +
geom_point(aes(x=x, y=y)) +
facet_wrap(~groupwrap) +
theme(strip.text.x=element_text(size=ps, family=family))