You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何为散点图添加文本标签?实现无重叠的标签标注

在散点图中添加无重叠的文本标签

你提供的示例代码会给所有数据点添加标签,但当数据点密集时,标签会严重重叠,完全没法看。要实现尽可能多且无重叠的标签,得用专门的标签位置调整逻辑,下面给你两种可行的方案(基于Julia的Plots生态):

方案1:用Grepel.jl自动避免重叠

这是最省心的方法,Grepel.jl是对标R语言ggrepel的包,能自动调整标签位置,避开其他标签和数据点。

首先安装包:

] add Grepel

然后修改你的代码:

using DataFrames, Plots, Grepel

df = DataFrame(x=rand(100), y=rand(100), z=randstring.(fill(5,100)))
scatter(df.x, df.y)
# 用grepel_annotate!替代annotate!,还能调整字体大小
grepel_annotate!(df.x, df.y, text.(df.z, 8))

这个方法会自动计算最优的标签位置,最大化可显示的标签数量同时避免重叠,效果比手动调整好很多。

方案2:手动过滤或调整标签位置

如果不想额外装包,可以写简单的逻辑过滤掉距离过近的点,或者微调标签位置:

using DataFrames, Plots, Distances

df = DataFrame(x=rand(100), y=rand(100), z=randstring.(fill(5,100)))
scatter(df.x, df.y)

# 设置距离阈值,只标注和其他已标注点距离足够远的点
distance_threshold = 0.1
coords = hcat(df.x, df.y)
# 计算所有点之间的欧氏距离
dist_matrix = pairwise(Euclidean(), coords, dims=1)

for i in 1:nrow(df)
    # 检查当前点和之前已标注的点是否都保持足够距离
    if all(dist_matrix[i, 1:i-1] .> distance_threshold)
        annotate!(df.x[i], df.y[i], text(df.z[i], 8))
    end
end

这种方法是基于简单的距离过滤,缺点是可能会漏掉一些可以合理标注的点,但好处是完全可控,你可以根据需求调整阈值或自定义位置偏移逻辑。

内容的提问来源于stack exchange,提问作者siebenstein

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.13 21:21:02