在 pyqtgraph 中的图像上显示网格线

Posted

技术标签:

【中文标题】在 pyqtgraph 中的图像上显示网格线【英文标题】:Show grid lines over image in pyqtgraph 【发布时间】:2018-03-17 00:04:02 【问题描述】:

我正在 pyqtgraph 中绘制图像,我希望能够看到网格线。但是网格线总是绘制在图像下方,因此图像的任何黑色区域都会遮挡网格。这是一个相当简单的例子:

import matplotlib  # necessary for interactive plots in pyqtgraph
import pyqtgraph as pg
import numpy as np
n = 100000
sigma_y = 1e-3
sigma_x = 1e-3
x0 = np.matrix([np.random.normal(0, sigma_x, n), np.random.normal(0, sigma_y, n)])
bins = 30
histogram, x_edges, y_edges = np.histogram2d(np.asarray(x0)[0], np.asarray(x0)[1], bins)
x_range = x_edges[-1] - x_edges[0]
y_range = y_edges[-1] - y_edges[0]

imv = pg.ImageView(view=pg.PlotItem())
imv.show()
imv.setPredefinedGradient('thermal')
imv.getView().showGrid(True, True)
imv.setImage(histogram, pos=(x_edges[0], y_edges[0]), scale=(x_range / bins, y_range / bins))

这是我看到的(缩小一点后)。您可以看到图像的黑色区域遮挡了网格线。

编辑:可以在 GUI 中将黑色更改为透明(不是我的首选,但目前还可以),因此您可以看到图像下方的网格。这工作正常,但我无法弄清楚如何在代码中做到这一点。如何从ImageView 中取出查找表进行修改?

【问题讨论】:

色阶由几种颜色之间的渐变组成。这些由颜色条右侧的三角形表示。如果单击底部的黑色三角形,将弹出一个对话框,您可以从中更改该设置点的颜色。将 alpha 分量设置为 0 以使比例的下限和透明。看看这对你有用。我相信它也可以通过编程方式完成。 其实还不错,而且比我预期的要好看。但我仍然希望在图像上方看到一条(微弱的)网格线。 【参考方案1】:

这就是我所做的。

glw = pyqtgraph.GraphicsLayoutWidget()
pw = glw.addPlot(0, 0)

# Fix Axes ticks and grid
for key in pw.axes:
    ax = pw.getAxis(key)

    # Set the grid opacity
    if grid_is_visible:
        ax.setGrid(grid_opacity * 255)
    else:
        ax.setGrid(False)

    # Fix Z value making the grid on top of the image
    ax.setZValue(1)

我认为这确实导致了其他一些问题。它可能是上下文菜单,或者它与平移和缩放有关,因为 Qt 是如何发出事件信号的。一个轴获得事件优先级并阻止事件传播到其他轴以进行平移和缩放。我向 pyqtgraph 提交了一个拉取请求,所以这可能不再是问题了。我不记得是什么导致了这个问题。它可能对你很好。我做了很多其他的事情,比如更改背景颜色和更改视图框背景颜色,这会导致一些小问题。

作为说明,我还更改了图像 z 值。不过你不应该这样做。

imv.setZValue(1)

【讨论】:

是的!这样可行。不过,您对这个问题是正确的(我使用的是 pyqtgraph 0.10.0)。使用网格下方的图像,我只能垂直平移。这可能已经够烦人了,我将把网格留在原来的位置。 我在 pyqtgraph 中进行了修复并提交了一个拉取请求。您可以进入您的站点包 python 文件夹并编辑 pyqtgraph。 github.com/pyqtgraph/pyqtgraph/pull/565 或者,如果你真的需要它,你可以使用我的 pyqtgraph 版本,但我并不总是更新我的版本,你会错过新的东西。 pip install git+http://github.com/HashSplat/pyqtgraph@mydevelop 你必须安装 git。 谢谢,是的,我找到了你的 PR。这只是一个装饰性的东西,所以我现在暂且不说,但我会留意你的 PR;如果它被接受,我将使用开发分支。

以上是关于在 pyqtgraph 中的图像上显示网格线的主要内容,如果未能解决你的问题,请参考以下文章

如何在python中删除图像上的网格线?

Unity小功能开发实战教程在UI画布上画网格线

音频处理Melodyne 网络缩放功能 ( 音符分离线 | 片段分离线 | 窗口滚动条 | 网格缩放 | 修改图像显示位置 | 显示五线谱 )

matplotlib 网格线不要覆盖柱状图

创建网格线并允许用户打开/关闭网格线视图

如果调用 showGrid,pyqtgraph 会切断刻度标签