在ggplot2中使用data.table的get函数通过字符串获取数据列绘图时,如何利用labeller显示列名及对应值
解决ggplot2中使用
get()获取分面变量时标签显示异常的问题 我懂你碰到的这个棘手问题——当用get(facetvar)指定分面变量时,label_both会把表达式get(facetvar)直接显示出来,而不是我们想要的实际变量名(比如setting)。其实有几个简单的办法能搞定这个问题,不用繁琐地硬编码所有内容:
方法1:使用.data代词替代get()
这是最直接的解决方案,.data是ggplot2推荐的引用列的方式,它能让ggplot正确识别到原始列名,这样label_both就能正常工作了:
library(ggplot2) df <- data.frame(coverage1 =rep( seq(0,1,0.20),each=4), coverage2 = rep( seq(0,1,0.20),each=4), setting=rep(c('1','2'),each=6), setting2=rep(c('B'),each=12), result=sample(100:1000, 12, replace = FALSE)) xvar='coverage1' yvar='coverage1' facetvar = 'setting' outcomevar = 'result' ggplot(data=df)+ geom_point(aes(x=get(xvar), y=get(yvar), size=get(outcomevar)),shape=21)+ # 用.data[[facetvar]]替代get(facetvar) facet_wrap(~.data[[facetvar]], labeller = labeller(.cols = label_both))+ labs(title = 'funny example plot', subtitle = 'how to get facetvar to show in labels', x = xvar, y = yvar, size = outcomevar)
这样分面标签就会显示setting: 1和setting: 2,完全符合预期。
方法2:自定义labeller(适合必须用get()的场景)
如果你因为某些原因一定要保留get(facetvar)的写法,可以用as_labeller自定义标签生成逻辑,直接用facetvar变量的值来构建标签:
ggplot(data=df)+ geom_point(aes(x=get(xvar), y=get(yvar), size=get(outcomevar)),shape=21)+ facet_wrap(~get(facetvar), labeller = as_labeller(function(values) { paste(facetvar, values, sep = ": ") }))+ labs(title = 'funny example plot', subtitle = 'how to get facetvar to show in labels', x = xvar, y = yvar, size = outcomevar)
这个方法的核心是利用facetvar这个字符串变量动态生成标签,不需要硬编码列名,灵活性很高。
本质上,问题的根源是get(facetvar)作为表达式被labeller解析时,它只会读取表达式的文本内容,而不是实际引用的列名。.data代词则能直接指向数据框中的列,让ggplot获取到正确的元信息。
内容的提问来源于stack exchange,提问作者Manuela R.
相关产品推荐
相关产品推荐

