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

PyQtGraph中ColorBarItem如何设置对数刻度显示?

解决PyQtGraph ColorBarItem对数刻度显示问题

核心思路

PyQtGraph的ColorBarItem默认使用线性映射,要实现对数刻度的颜色条,需要同时处理数据的对数转换、颜色映射的对数化适配,以及刻度标签的自定义显示,三者必须对应才能得到符合预期的效果。

分步解决方案

  1. 修正颜色映射的stops处理
    原始stops是线性数值,需要先排序,再转换为对数后归一化到[0,1]区间(ColorMap要求stops必须是0到1的线性刻度),这样才能和对数转换后的图像数据对应。

  2. 正确处理图像数据
    对原始数据取对数转换,同时避免log(0)的错误,可将数据截断到最小的stops值或极小正数。

  3. 自定义颜色条的刻度标签
    重写ColorBar轴的刻度生成函数,将轴上的线性位置转换回原始的线性数值作为标签,让用户看到实际数据范围。

完整代码示例

import numpy as np
import pyqtgraph as pg
from pyqtgraph.Qt import QtGui

# 你的原始自定义参数
original_stops = np.array([0.00005, 0.00003, 0.0001, 0.0003, 0.001, 0.003, 0.01, 0.03, 0.1, 0.3, 1])
colors = 255 * np.array([
    [0, 0, 0, 1], [0.9, 0.9, 0.9, 0.9], [0.83, 0.83, 0.8, 0.9],
    [0.84, 0.15, 0.74, 0.7], [0.64, 0.07, 0.55, 1], [0.22, 0.36, 1, 1],
    [0, 1, 0.1, 1], [1, 0, 0, 0.9], [1, 0.96, 0, 1], [1, 0.39, 0, 1], [1, 0, 0, 1]
])

# 1. 处理ColorMap的stops:排序→取对数→归一化到[0,1]
sorted_stops = np.sort(original_stops)
log_stops = np.log10(sorted_stops)
min_log, max_log = log_stops.min(), log_stops.max()
cmap_stops = (log_stops - min_log) / (max_log - min_log)

# 创建自定义ColorMap
cmap = pg.ColorMap(cmap_stops, colors)

# 2. 处理原始数据:转换为对数,避免log(0)错误
# 替换为你的实际数据self.data
data = np.random.uniform(low=sorted_stops[0], high=sorted_stops[-1], size=(100,100))
log_data = np.log10(np.maximum(data, sorted_stops[0]))

# 3. 创建图像和对数刻度颜色条
app = QtGui.QApplication([])
win = pg.GraphicsLayoutWidget()

# 添加图像显示
view = win.addViewBox()
img_item = pg.ImageItem(log_data)
img_item.setLookupTable(cmap.getLookupTable())
view.addItem(img_item)

# 自定义刻度生成函数:将轴的线性位置转换为原始数值标签
def log_tick_func(values, scale):
    # 将ColorBar的0-1线性位置转换为对数数值
    log_vals = min_log + values * (max_log - min_log)
    # 转换回原始线性数值
    original_vals = 10 ** log_vals
    # 生成可读性强的标签(自动适配科学计数法或小数)
    return [f"{v:.5g}" for v in original_vals]

# 创建ColorBarItem并关联图像
color_bar = pg.ColorBarItem(
    values=(min_log, max_log),
    colorMap=cmap,
    label='Value'
)
color_bar.getAxis().setTickFunction(log_tick_func)
color_bar.setImageItem(img_item)

win.addItem(color_bar)
win.show()
app.exec_()

关键注意事项

  • 必须先对原始stops排序,否则颜色映射的顺序会混乱。
  • 数据处理时务必避免log(0),用np.maximum截断到最小有效数值。
  • 自定义tickFunc是让颜色条显示原始数值的核心,否则刻度会显示对数后的数值,不符合预期。

内容的提问来源于stack exchange,提问作者Pedram Abdolghader

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.24 04:55:33