1. 程式人生 > 程式設計 >將matplotlib繪圖嵌入pyqt的方法示例

將matplotlib繪圖嵌入pyqt的方法示例

我的終極整理,供參考

# coding:utf-8
import matplotlib
# 使用 matplotlib中的FigureCanvas (在使用 Qt5 Backends中 FigureCanvas繼承自QtWidgets.QWidget)
from matplotlib.backends.backend_qt5agg import FigureCanvasQTAgg as FigureCanvas
from PyQt5 import QtCore,QtWidgets,QtGui
from PyQt5.QtWidgets import QDialog,QPushButton,QVBoxLayout
import matplotlib.pyplot as plt
import numpy as np
import sys
"""學好pyplot API和麵向物件 API搞定matplotlib繪圖顯示在GUI介面上"""
 
class Main_window(QDialog):
  def __init__(self):
    super().__init__()
    # 三步走,定Figure,定Axes,定FigureCanvas
    # 1 直接一段程式碼搞定figure和axes
    self.figure,(self.ax1,self.ax2) = plt.subplots(figsize=(13,3),ncols=2)
 
    # 2 先建立figure再建立axes
    # 2.1 用plt.figure() / Figure() 建立figure,推薦前者
    self.figure = plt.figure(figsize=(5,facecolor='#FFD7C4')
    # self.figure = Figure(figsize=(5,facecolor='#FFD7C4')
    # 2.2 用plt.subplots() / plt.add_subplot() 建立axes, 推薦前者
    (self.ax1,self.ax2) = self.figure.subplots(1,2)
    # ax1 = self.figure.add_subplot(121)
    # ax2 = self.figure.add_subplot(122)
 
    # 3 繫結figure到canvas上
    self.canvas = FigureCanvas(self.figure)
 
    self.button_draw = QPushButton("繪圖")
    self.button_draw.clicked.connect(self.Draw)
 
    # 設定佈局
    layout = QVBoxLayout()
    layout.addWidget(self.canvas)
    layout.addWidget(self.button_draw)
    self.setLayout(layout)
 
  def Draw(self):
    AgeList = ['10','21','12','14','25']
    NameList = ['Tom','Jon','Alice','Mike','Mary']
    # 將AgeList中的資料轉化為int型別
    AgeList = list(map(int,AgeList))
 
    # 將x,y轉化為numpy資料型別,對於matplotlib很重要
    self.x = np.arange(len(NameList)) + 1
    self.y = np.array(AgeList)
 
    # tick_label後邊跟x軸上的值,(可選選項:color後面跟柱型的顏色,width後邊跟柱體的寬度)
    self.ax1.bar(range(len(NameList)),AgeList,tick_label=NameList,color='green',width=0.5)
    for a,b in zip(self.x,self.y):
      self.ax1.text(a-1,b,'%d' % b,ha='center',va='bottom')
    plt.title("Demo")
 
    pos = self.ax2.imshow(np.random.random((100,100)),cmap=plt.cm.BuPu_r)
    self.figure.colorbar(pos,ax=self.ax2)   # 終於可以用colorbar了
 
    self.canvas.draw()
 
 
# 執行程式
if __name__ == '__main__':
  app = QtWidgets.QApplication(sys.argv)
  main_window = Main_window()
  main_window.show()
  app.exec()

總結就是,想要在特定的位置放matplotlib繪圖還是要用面向物件的API,但混合使用pyplot的API可以使程式碼更簡單。

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支援我們。