在Julia中使用Makie如何删除scatter!绘制的散点?
Makie删除散点的正确实现方法
你之前的代码无法运行有两个核心原因:
- 新版Makie(v0.19及以后)不再推荐直接操作底层Scene对象,
scatter!等变异绘图函数的第一个入参应为Axis轴对象而非Scene对象,因此直接传scene会报错 - 散点等绘图元素存储在
Axis对应scene的plots数组中,不存在scene.scatter这个属性,旧版本的操作语法已经过时。
以下是两种适配新版Makie的解决方案,均可满足你「同一时间仅保留一个散点、可随时删除」的需求:
方案1:存储散点对象后调用delete!删除(最稳定,推荐)
该方法不会误删其他绘图元素,无需依赖绘图顺序,完全符合你的使用场景:
using GLMakie # 按需替换为CairoMakie/WGLMakie # 1. 初始化画布、轴,可先绘制其他固定内容 fig, ax = lines(0:0.1:2pi, sin.(0:0.1:2pi), label="背景曲线") # 2. 绘制散点时直接接住返回的绘图对象 current_scatter = scatter!(ax, [pi/2], [1.0], color=:red, markersize=12, label="临时散点") axislegend(ax) display(fig) # 此时可看到红色散点 # 3. 需要删除散点时执行即可 delete!(ax, current_scatter) axislegend(ax) # 刷新图例,散点对应的图例项会同步消失 display(fig) # 此时散点已被移除
如果需要新增散点,只需重新给current_scatter赋值新的scatter!返回值即可,新增前可先调用delete!删除旧散点,保证同一时间仅存在一个散点。
方案2:直接弹出最后一个绘图元素
如果你每次都是最后绘制散点,不需要额外存储变量,可以直接弹出plots数组的最后一个元素:
# 绘制散点 scatter!(ax, [pi], [0.0], color=:blue, markersize=12) # 删除最后绘制的元素(即上述散点) pop!(ax.scene.plots)
该方法依赖绘图顺序,若散点不是最后一个绘制的元素会误删其他内容,仅适合简单场景使用。
内容的提问来源于stack exchange,提问作者noahkiwi
相关产品推荐
相关产品推荐

