簡體   English   中英

Matplotlib將圖形嵌入到UI PyQt5中

[英]Matplotlib Embed a graph in to a UI PyQt5

我在另一個繪制圖形的腳本中有一個函數,因此圖形已經預先繪制,我只想將它放在PyQt5中我的界面上的一個小部件中。 我已導入它,當它運行時,它會打開兩個窗口,一個帶有圖形,一個帶有用戶界面。任何想法?

這是代碼:

def minionRatioGraph(recentMinionRatioAvg):
    x = recentMinionRatioAvg
    a = x*10
    b = 100-a
    sizes = [a, b]
    colors = ['#0047ab', 'lightcoral']
    plt.pie(sizes, colors=colors)

    #determine score colour as scolour
    if x < 5:
       scolour = "#ff6961" #red
    elif 5 <= x < 5.5:
       scolour = "#ffb347" #orange
    elif 5.5 <= x < 6.5:
       scolour = "#77dd77" #light green
    elif 6.5 <= x:
       scolour = "#03c03c" # dark green

    #draw a circle at the center of pie to make it look like a donut
    centre_circle = plt.Circle((0,0),0.75, fc=scolour,linewidth=1.25)
    fig = plt.gcf()
    fig.gca().add_artist(centre_circle)

    # Set aspect ratio to be equal so that pie is drawn as a circle.
    plt.axis('equal')
    plt.show()

這是一個腳本。 在我的GUI腳本中,我導入了以下內容:

from PyQt5 import QtCore, QtGui, QtWidgets
import sqlite3
import matplotlib.pyplot as plt
from matplotlib.figure import Figure
from matplotlib.backends.backend_qt5agg import FigureCanvasQTAgg as 
FigureCanvas
from graphSetup import *

在我的窗口類的開頭,在setup函數之前,我有這個函數:

def minionGraphSetup(self, recentMinionRatioAvg):
    minionRatioGraph(recentMinionRatioAvg)

您不需要調用plt.show而是需要將導入腳本生成的圖形放入PyQt GUI的FigureCanvas中。

所以在你的繪圖腳本中做

def minionRatioGraph(recentMinionRatioAvg):
    ...
    fig = plt.gcf()
    fig.gca().add_artist(centre_circle)
    plt.axis('equal')
    #plt.show() <- don't show window!
    return fig

在GUI腳本中,使用獲得的圖形將其放入畫布中。

def minionGraphSetup(self, recentMinionRatioAvg):
    fig = minionRatioGraph(recentMinionRatioAvg)
    ...
    self.canvas = FigureCanvas(fig, ...)


如果要返回圖像,可以將其保存到字節緩沖區,

def minionGraphSetup(self, recentMinionRatioAvg):
    image = minionRatioGraph(recentMinionRatioAvg)
    label = QLabel() 
    pixmap = QPixmap(image)
    label.setPixmap(pixmap)

然后在PyQt GUI中將其顯示為圖像。 (我沒有測試下面的內容,所以它可能會有所不同。)

 def minionGraphSetup(self, recentMinionRatioAvg): image = minionRatioGraph(recentMinionRatioAvg) label = QLabel() pixmap = QPixmap(image) label.setPixmap(pixmap) 

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM