Plots.jl(GR)绘图区域限制对系列注解无效是Bug还是预期行为?
问题定性
该现象属于Plots.jl的预期设计行为,并非程序Bug。
Plots.jl中xlim、ylim参数的默认裁剪规则仅作用于散点、线条等主绘图序列元素,series_annotations归属独立的文本标注层,默认不会随主序列被轴域范围自动裁剪,即便标注锚点落在设定的显示区间外,文本仍会被渲染到画布上。
注解显示区域限制方案
可根据使用场景选择以下两种实现方式:
- 预过滤注解数据
传入series_annotations参数前先做坐标判断,仅为落在目标显示区间内的数据点绑定有效注解,区间外的点传入空文本即可,该方案兼容所有Plots后端。
可直接运行的修改后示例:x = 1:1:30 y = x # 定义目标显示区间 x_range = (5, 25) y_range = (3, 30) # 生成过滤后的注解列表 annotations = map(zip(x, y)) do (xi, yi) in_x = x_range[1] ≤ xi ≤ x_range[2] in_y = y_range[1] ≤ yi ≤ y_range[2] in_x && in_y ? text(xi, :bottom) : text("") end plot(x, y, zcolor = x, seriestype = :scatter, title = "My plot", xlim = x_range, ylim = y_range, markersize = 5, label = "", series_annotations = annotations) - 开启GR后端专属裁剪属性
如果固定使用GR后端,可直接开启全局裁剪开关,所有超出轴域范围的元素(包括注解文本)都会被自动隐藏,无需手动过滤数据:# 开启GR后端裁剪功能 gr(clip = true) x = 1:1:30 plot(x, x, zcolor = x, seriestype = :scatter, title = "My plot", xlim = (5, 25), ylim = (3, 30), markersize = 5, label = "", series_annotations = text.(x, :bottom))注意:
clip=true是GR后端的专属参数,切换至PyPlot、Plotly等其他后端时该参数不生效。
内容的提问来源于stack exchange,提问作者Anton Degterev
相关产品推荐
相关产品推荐

