PyQtGraph中如何将ImageItem的轴设置为指定值
解决PyQtGraph中ImageItem轴范围与自定义刻度问题
问题原因
你的代码里直接给AxisItem设置范围无效,是因为ImageItem默认使用像素索引作为坐标(10x10的数据对应x轴0-9、y轴0-9),PlotItem的视图范围会自动适配图像的默认坐标,导致自定义的轴范围被覆盖。
解决步骤
- 映射ImageItem到目标坐标范围:用
setRect()指定图像在坐标系中的位置和尺寸,让像素对应到你需要的数值范围。 - 自定义轴刻度:通过AxisItem的
setTicks()方法设置指定的刻度数组。
修改后的代码
import numpy as np import pyqtgraph as pg from PyQt5 import QtCore app = pg.mkQApp('Example') layout = pg.GraphicsLayoutWidget(show=True) plot_item = pg.PlotItem(title="") image_item = pg.ImageItem() # 关键:将图像映射到x∈[-100,100]、y∈[-100,100]的范围 # QRectF参数:x起始值, y起始值, x方向总长度, y方向总长度 image_item.setRect(QtCore.QRectF(-100, -100, 200, 200)) plot_item.addItem(image_item) layout.addItem(plot_item) data = np.random.rand(10,10) image_item.setImage(data) # 自定义底部轴 axb = pg.AxisItem(orientation='bottom') # 强制设置PlotItem的视图范围,确保轴显示正确 plot_item.setRange(xRange=[-100, 100], yRange=[-100, 100]) # 设置自定义刻度数组(两种任选其一) # 方式1:固定间隔刻度 custom_ticks = [-100,-75,-50,-25,0,25,50,75,100] # 方式2:线性生成刻度(注意:100个刻度会过于密集,建议调整数量) # custom_ticks = np.linspace(-100, 100, 10).tolist() # 给轴设置主刻度:每个刻度值对应显示的文本 axb.setTicks([[(tick, str(tick)) for tick in custom_ticks]]) plot_item.setAxisItems(axisItems={'bottom': axb}) if __name__ == '__main__': pg.exec()
关键说明
setRect():让ImageItem的像素与目标坐标系关联,10x10的图像会被拉伸填充到[-100,-100]到[100,100]的矩形区域。setTicks():接受一个二维列表,第一个子列表是主刻度((刻度值, 显示文本)),第二个子列表可设置次刻度(可选)。- 如果使用
np.linspace(-100,100,100)生成刻度,建议减少数量(比如改成10个),避免刻度文本重叠。
内容的提问来源于stack exchange,提问作者Mo0nKizz
相关产品推荐
相关产品推荐

