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

如何交互式更改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

逻辑解释

  1. Observable绑定:Makie的交互功能依赖Observable传递状态变化,将colormap设为cmap而非cmap[],才能让Topoplot持续监听颜色数组的修改。
  2. 触发更新:直接修改cmap[]的元素后,必须调用notify(cmap),否则Makie无法感知数组内容变化,不会重绘标记点。
  3. 颜色逻辑修正:原代码中恢复上一个点时错误设置为红色,现在改为黑色,确保只有当前选中项呈现红色高亮。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.05 00:46:00