ggplot2中如何将文本沿密度曲线等任意曲线路径放置?
问题描述
请问在ggplot2中,是否可以将文本沿着密度线或任意路径放置?我想实现两类效果:
- 一类是将单个标签沿曲线排布,类似xkcd漫画1835、1950(中间面板)、1392、2234(中间面板)的风格
- 另一类是用重复的文本构成线条,类似xkcd #930的效果
注意:我所指的并非手绘xkcd风格,也不是在图表顶部放置水平标签。
我知道可以通过annotate或geom_text添加水平文本,但我希望实现文本弯曲、贴合数据曲线的效果。同时我也想了解这种「文本沿线条排布」的风格是否有专门名称?
以下是使用annotate(...)绘制的ggplot2示例图:
下图是在Inkscape中修改上述图表、添加曲线文本后的效果:
补充示例数据
3月、4月两次试运行的示例数据如下:
df <- data.frame( monthly_run = c('March', 'March', 'March', 'March', 'March', 'March', 'March', 'March', 'March', 'March', 'March', 'March', 'March', 'March', 'April', 'April', 'April', 'April', 'April', 'April', 'April', 'April', 'April', 'April', 'April', 'April', 'April', 'April'), duration = c(36, 44, 45, 48, 50, 50, 51, 54, 55, 57, 60, 60, 60, 60, 30, 40, 44, 47, 47, 47, 53, 53, 54, 55, 56, 57, 69, 77) ) ggplot(df, aes(x = duration, group = monthly_run, color = monthly_run)) + geom_density() + theme_minimal()
解答
这种文本沿路径排布的效果通常叫做路径文本或者曲线文本,如果是用重复文本填充线条的形式也被称为文本线条。
你要的两类效果都可以通过geomtextpath包直接在ggplot2中实现,不需要导出到第三方设计软件修改。
首先安装依赖包:
install.packages("geomtextpath")
单个标签沿密度线排布
直接将原代码的geom_density替换为geom_textdensity,指定标签内容即可:
library(ggplot2) library(geomtextpath) ggplot(df, aes(x = duration, group = monthly_run, color = monthly_run)) + geom_textdensity(aes(label = monthly_run), size = 4, hjust = 0.7) + theme_minimal()
可以通过hjust调整标签在曲线上的横向位置,vjust调整标签和曲线的垂直距离,包会自动避开曲线极值点避免文字变形重叠。
重复文本构成整条曲线
设置repeat_text = TRUE和文本间距参数即可实现整条线由重复文本组成的效果:
ggplot(df, aes(x = duration, group = monthly_run, color = monthly_run)) + geom_textpath(aes(label = monthly_run), stat = "density", size = 3, spacing = 50, repeat_text = TRUE) + theme_minimal()
如果需要同时保留原密度线,叠加一层半透明的geom_density即可。
其他可调参数
- 加
text_only = TRUE可以只显示文本、隐藏底层线条 - 支持任意自定义路径,只要传入路径的x/y坐标就能生成任意形状的曲线文本
- 文本的字体、颜色、大小等参数和原生
geom_text完全兼容,调整方式一致
内容的提问来源于stack exchange,提问作者byteit101
相关产品推荐
相关产品推荐

