如何交互式更改Topoplot中标记点的颜色?
解决方案
你的问题出在两个核心点:一是给Topoplot的colormap传入的是Observable的当前值而非Observable本身,二是修改颜色数组后没有通知Observable触发绘图更新。按以下方式修改即可实现标记点的交互式颜色切换:
关键修改说明
- 给
eeg_topoplot!的colormap参数传入Observable对象cmap,而非它的当前值cmap[],让Topoplot能监听颜色变化 - 修改颜色数组后,调用
notify(cmap)通知Makie刷新绘图 - 修正颜色切换逻辑:恢复上一个选中点为黑色,当前选中点设为红色,保证选中状态唯一
修改后的完整代码
f = Figure(backgroundcolor = RGBf(0.98, 0.98, 0.98), resolution = (1500, 700)) ax = Axis(f[1:3, 1], xlabel = "Time [s]", ylabel = "Voltage amplitude [µV]") N = 1:length(pos) #1:4 hidespines!(ax, :t, :r) GLMakie.xlims!(-0.3, 1.2) hlines!(0, color = :gray, linewidth = 1) vlines!(0, color = :gray, linewidth = 1) times = range(-0.3, length=size(dat_e,2), step=1 ./ 128) lines = Dict() for i in N mean_trial = mean(dat_e[i,:,:],dims=2)[:,1] line = lines!(times, mean_trial, color = "black") lines[i] = line end hidedecorations!(ax, label = false, ticks = false, ticklabels = false) topo_axis = Axis(f[2, 2], width = 178, height = 178, aspect = DataAspect()) Makie.xlims!(low = -0.2, high = 1.2) Makie.ylims!(low = -0.2, high = 1.2) topoMatrix = eegHeadMatrix(pos[N], (0.5, 0.5), 0.5) # 初始化全黑的颜色Observable cmap = Observable(fill(RGB{N0f8}(0.0,0.0,0.0), length(N))) topo = eeg_topoplot!(topo_axis, N, raw.ch_names[1:30]; positions=pos, interpolation=NullInterpolator(), enlarge=1, colormap = cmap, # 传入Observable对象而非当前值 label_text=false) hidedecorations!(current_axis()) hidespines!(current_axis()) num_prev = 0 menu = Menu(f[3, 2], options = raw.ch_names[1:30], default = nothing) on(menu.selection) do selected if selected != nothing num = findall(x->x==selected, raw.ch_names[1:30])[] if num_prev != 0 # 恢复上一个选中项的颜色 lines[num_prev].color = "black" cmap[][num_prev] = RGB{N0f8}(0.0,0.0,0.0) end # 设置当前选中项的颜色 lines[num].color = "red" cmap[][num] = RGB{N0f8}(1.0,0.0,0.0) # 通知Observable更新,触发绘图刷新 notify(cmap) num_prev = num end end notify(menu.selection) f
逻辑解释
- Observable绑定:Makie的交互功能依赖Observable传递状态变化,将
colormap设为cmap而非cmap[],才能让Topoplot持续监听颜色数组的修改。 - 触发更新:直接修改
cmap[]的元素后,必须调用notify(cmap),否则Makie无法感知数组内容变化,不会重绘标记点。 - 颜色逻辑修正:原代码中恢复上一个点时错误设置为红色,现在改为黑色,确保只有当前选中项呈现红色高亮。
内容的提问来源于stack exchange,提问作者Vladimir Mikheev
相关产品推荐
相关产品推荐

