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

如何在Jupyter中实现基于2D颜色面板的鼠标动态选色拾色器?

嘿,这个需求我刚好折腾过!要在Jupyter Notebook里搞一个能鼠标点选的2D颜色面板,替代默认的widgets.ColorPicker,用ipywidgets加matplotlib就能轻松实现,下面是完整的方案和代码:

实现2D动态颜色选择面板的方案

核心思路

我们可以用matplotlib绘制一个色相-饱和度的2D颜色空间(这是最常用的可视化颜色选择布局),然后通过ipywidgets的交互功能捕捉鼠标点击位置,实时把点击坐标转换成对应的RGB颜色值,再搭配一个预览框展示选中的颜色,完美替代默认的颜色选择器。

完整代码实现

直接复制这段代码到Jupyter Notebook里运行就能看到效果:

import ipywidgets as widgets
import matplotlib.pyplot as plt
import numpy as np
from matplotlib.backend_bases import MouseButton

# 生成色相-饱和度的2D颜色面板
def create_color_panel():
    # 色相范围0-360度,饱和度范围0-1
    h = np.linspace(0, 360, 360)
    s = np.linspace(0, 1, 100)
    h, s = np.meshgrid(h, s)
    # 固定明度为0.5,转换为HSV格式后转RGB
    v = np.ones_like(h) * 0.5
    hsv = np.stack([h/360, s, v], axis=-1)
    rgb = plt.cm.hsv(hsv)
    return rgb

# 全局变量存储选中的颜色,默认蓝色
selected_color = np.array([0, 0, 1])

# 创建UI组件:颜色预览框(不可编辑,只用来展示)
color_preview = widgets.ColorPicker(value='blue', disabled=True, description='选中颜色')
# 用来显示颜色面板的输出区域
output = widgets.Output()

# 绘制颜色面板并绑定鼠标点击事件
with output:
    fig, ax = plt.subplots(figsize=(6, 4))
    color_panel = create_color_panel()
    ax.imshow(color_panel, extent=[0, 360, 0, 1])
    ax.set_xlabel('色相')
    ax.set_ylabel('饱和度')
    ax.set_title('左键点击选择颜色')
    plt.tight_layout()

    # 处理鼠标点击事件的函数
    def on_click(event):
        global selected_color
        # 只响应左键点击,且点击在颜色面板范围内
        if event.button is MouseButton.LEFT and event.inaxes == ax:
            # 把点击坐标转换成颜色面板的索引
            h_idx = int(np.clip(event.xdata, 0, 359))
            s_idx = int(np.clip(event.ydata * 100, 0, 99))
            # 获取对应的RGB值,转成十六进制格式
            rgb = color_panel[s_idx, h_idx, :3]
            selected_color = rgb
            hex_color = '#{:02x}{:02x}{:02x}'.format(
                int(rgb[0]*255), int(rgb[1]*255), int(rgb[2]*255)
            )
            # 更新预览框的颜色
            color_preview.value = hex_color

    # 绑定鼠标点击事件到画布
    fig.canvas.mpl_connect('button_press_event', on_click)

# 把预览框和颜色面板组合起来显示
ui = widgets.VBox([color_preview, output])
display(ui)

代码细节解释

  • 颜色面板生成:用numpy生成色相和饱和度的网格,固定明度为0.5(你也可以改成动态调节的),通过matplotlib的hsv颜色映射转换成RGB颜色图。
  • 鼠标交互:通过fig.canvas.mpl_connect绑定鼠标左键点击事件,计算点击位置对应的颜色值,转成十六进制后同步到预览框。
  • UI布局:用widgets.VBox把预览组件和绘图区域垂直排列,在Notebook里展示完整的交互界面。

扩展玩法

  • 如果你想要其他类型的2D面板,比如色相-明度或者饱和度-明度,只需要修改create_color_panel里固定的参数就行。
  • 想要支持拖动实时选色?把button_press_event换成motion_notify_event,再加个鼠标按下的状态判断就可以实现。
  • 可以把selected_color变量绑定到其他交互组件,比如用来修改图表的线条颜色、文本颜色等,实现更复杂的交互场景。

内容的提问来源于stack exchange,提问作者M.R.

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 07:16:50