將matplotlib繪圖嵌入pyqt的方法示例
阿新 • • 發佈:2020-01-09
我的終極整理,供參考
# 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可以使程式碼更簡單。
以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支援我們。