【问题标题】:Python - matplotlib - PyQT: plot to QPixmapPython - matplotlib - PyQT:绘制到 QPixmap
【发布时间】:2015-08-19 04:49:43
【问题描述】:

我想可视化 matplotlibs 颜色图(类似于 http://matplotlib.org/examples/color/colormaps_reference.html)并将其用作 PyQt 小部件中的 QPixmaps。这个想法是在 matplotlib 中创建绘图而不实际显示它(或将其保存到文件中)并将其转换为 QPixmap。这里提供的解决方案 (Python - matplotlib - PyQT: Copy image to clipboard) 似乎不起作用,可能是因为我不想显示 matplotlib 图。

【问题讨论】:

  • 您应该使用上下文代码 - 您链接的问题的答案应该可以正常工作,并且根本不需要显示 matplotlib 图,因此您应该澄清“不起作用”的意思。 "
  • 在我抓取像素图后,它的大小为 0x0
  • 最后,我换了一种方式:我没有使用matplotlib创建渐变,而是使用了QImage的setPixel方法
  • 正是 QtAgg 后端所做的。如果您真的不想使用 mpl 提供的 QT 小部件,请使用 Agg 后端并获取原始 RGBA 缓冲区。请参阅 github.com/matplotlib/matplotlib/blob/master/lib/matplotlib/… 了解我们如何在内部进行操作。
  • @tcaswell 我相信您对原始 RGBA 缓冲区了解很多,但我不知道。我可以在 matplotlib.org 上找到的唯一参考资料在这里:matplotlib.org/examples/pylab_examples/agg_buffer_to_array.html

标签: python matplotlib plot pyqt


【解决方案1】:

我已经尝试了以下方法并且有效:

def testColourMap(cmap):
    sp = SubplotParams(left=0., bottom=0., right=1., top=1.)
    fig = Figure((2.5,.2), subplotpars = sp)
    canvas = FigureCanvas(fig)
    ax = fig.add_subplot(111)
    gradient = np.linspace(0, 1, 256)
    gradient = np.vstack((gradient, gradient))
    ax.imshow(gradient, aspect=10, cmap=cmap)
    ax.set_axis_off()
    canvas.draw()
    size = canvas.size()
    width, height = size.width(), size.height()
    im = QImage(canvas.buffer_rgba(), width, height, QImage.Format_ARGB32)
    return QPixmap(im)

【讨论】:

    【解决方案2】:

    Matplotlib 通过后端支持 PySide(参见例如 this tutorial),但还没有支持新的 PySide6,所以我遇到了类似的问题。

    部分基于上面迈克尔的回答,我发现以下最小示例可用于 PySide6 6.1.0 和 matplotlib 3.4.2:

    from PySide6.QtGui import QImage, QPixmap
    from matplotlib.backends.backend_agg import FigureCanvasAgg as FigureCanvas
    from matplotlib.figure import Figure
    
    def get_q_pixmap():
        fig = Figure()
        canvas = FigureCanvas(fig)
        ax = fig.add_subplot(111)
        ax.plot([1, 2, 4, 3])
        ax.set_title('test plot')
        canvas.draw()
        
        width, height = fig.figbbox.width, fig.figbbox.height
        img = QImage(canvas.buffer_rgba(), width, height, QImage.Format_ARGB32)
        pixmap = QPixmap(img)
        return pixmap
    

    对我来说有点违反直觉,显示此QPixmap 的最简单方法似乎是使用QLabelsetPixmap() 方法。

    【讨论】:

      猜你喜欢
      • 2016-08-21
      • 2013-07-14
      • 2015-01-15
      • 1970-01-01
      • 2015-06-23
      • 1970-01-01
      • 2018-10-02
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多