Pyqt5相關文章:
快速掌握Pyqt5的三種主窗口
快速掌握Pyqt5的2種彈簧
快速掌握Pyqt5的5種布局
快速弄懂Pyqt5的5種項目視圖(Item View)
快速弄懂Pyqt5的4種項目部件(Item Widget)
快速掌握Pyqt5的6種按鈕
快速掌握Pyqt5的10種容器(Containers)
快速掌握Pyqt5的20種輸入控件(Input Widgets)
快速掌握Pyqt5的9種顯示控件
詳細學習Pyqt5中的5種布局方式
詳細學習Pyqt5中的6種按鈕
詳細學習Pyqt5中的2種彈簧
詳細學習Pyqt5的5種項目視圖(Item View)
詳細學習Pyqt5的4種項目部件(Item Widget)
詳細學習Pyqt5的20種輸入控件(Input Widgets)
詳細學習Pyqt5的9種顯示控件
詳細學習Pyqt5的10種容器(Containers)
詳細學習PyQt5與數據庫交互
詳細學習PyQt5中的多線程
快速學習PyQt5的動畫和圖形效果
快速學習PyQt5的高級自定義控件
快速學會繪制Pyqt5中的所有圖(上)
快速學會繪制Pyqt5中的所有圖(下)
待續。。。
雷達圖
PyQtGraph 并不直接支持雷達圖(也稱為蜘蛛網圖或極坐標圖),但您可以使用 PyQt 的繪圖能力手動創建一個。要在 PyQt 中繪制雷達圖,您需要使用 QPainter
類來在 QWidget
或類似對象上進行自定義繪圖。
以下是一個使用 PyQt5 創建簡單雷達圖的示例:
編寫代碼繪制雷達圖:
import sys
import math
from PyQt5.QtWidgets import QApplication, QWidget
from PyQt5.QtGui import QPainter, QPolygon, QPen
from PyQt5.QtCore import Qt, QPoint class RadarWidget(QWidget): def __init__(self, data): super().__init__() self.data = data def paintEvent(self, event): painter = QPainter(self) painter.setRenderHint(QPainter.Antialiasing) # 雷達圖的中心點 center = QPoint(int(self.width() / 2), int(self.height() / 2)) radius = min(int(self.width() / 2), int(self.height() / 2)) - 10 # 繪制雷達圖的軸 num_axes = len(self.data) for i in range(num_axes): angle = 2 * math.pi * i / num_axes x =int( center.x() + radius * math.cos(angle)) y =int( center.y() + radius * math.sin(angle)) painter.drawLine(center, QPoint(x, y)) # 繪制雷達圖的數據多邊形 polygon = QPolygon() for i in range(num_axes): angle = 2 * math.pi * i / num_axes value = self.data[i] x = int(center.x() + value * radius * math.cos(angle)) y = int(center.y() + value * radius * math.sin(angle)) polygon << QPoint(x, y) painter.setPen(QPen(Qt.blue, 2)) painter.drawPolygon(polygon) # 創建一個 QApplication 實例
app = QApplication(sys.argv) # 創建雷達圖窗口
radar_data = [0.7, 0.8, 0.5, 0.6, 0.9] # 示例數據
radarWidget = RadarWidget(radar_data)
radarWidget.resize(400, 400)
radarWidget.show() # 啟動應用程序的事件循環
sys.exit(app.exec_())
在這個例子中,我們創建了一個繼承自 QWidget
的 RadarWidget
類來顯示雷達圖。數據以列表形式傳遞給 RadarWidget
,每個元素表示雷達圖上一個軸的值。
流程圖
在 PyQtGraph 中繪制流程圖需要使用圖形和線條來手動創建圖形元素。PyQtGraph 主要專注于數據可視化,并不直接支持流程圖的繪制。但是,您可以使用 PyQt5 的圖形視圖框架(QGraphicsScene
和 QGraphicsView
)來創建流程圖。
以下是使用 PyQt5 創建簡單流程圖的示例代碼:
編寫代碼繪制流程圖:
import sys
import math
from PyQt5.QtWidgets import QApplication, QGraphicsScene, QGraphicsView, QGraphicsRectItem, QGraphicsTextItem, QGraphicsLineItem,QGraphicsPolygonItem
from PyQt5.QtCore import Qt, QRectF, QPointF, QLineF
from PyQt5.QtGui import QPen, QBrush, QColor, QPolygonF class Arrow(QGraphicsLineItem): def __init__(self, start_item, end_item, parent=None): super().__init__(parent) # 計算起始點和結束點 start_point = start_item.mapToScene(start_item.rect().bottomLeft() + QPointF(start_item.rect().width() / 2, 0)) end_point = end_item.mapToScene(end_item.rect().topLeft() + QPointF(end_item.rect().width() / 2, 0)) # 設置線條 line = QLineF(start_point, end_point) self.setLine(line) self.setPen(QPen(Qt.black, 2)) # 箭頭頭部尺寸 arrow_size = 9.0 # 計算箭頭角度 angle = math.atan2(-line.dy(), line.dx()) # 創建箭頭頭部 arrow_head = QPolygonF() arrow_head.append(line.p2()) arrow_head.append(line.p2() - QPointF(math.sin(angle + math.pi / 3) * arrow_size, math.cos(angle + math.pi / 3) * arrow_size)) arrow_head.append(line.p2() - QPointF(math.sin(angle + math.pi - math.pi / 3) * arrow_size, math.cos(angle + math.pi - math.pi / 3) * arrow_size)) # 添加箭頭頭部到場景 arrow_head_item = QGraphicsPolygonItem(arrow_head, self) arrow_head_item.setBrush(Qt.black) arrow_head_item.setPen(QPen(Qt.black, 2)) class FlowChartNode(QGraphicsRectItem): def __init__(self, text, x, y, width, height, parent=None): super().__init__(x, y, width, height, parent) self.setBrush(QBrush(QColor(200, 200, 255))) self.setPen(QPen(Qt.black, 2)) # 添加文本標簽 text_item = QGraphicsTextItem(text, self) text_item.setPos(x + 10, y + 10) text_item.setTextWidth(width - 20) app = QApplication(sys.argv)
scene = QGraphicsScene() node1 = FlowChartNode("開始", 50, 50, 100, 50)
node2 = FlowChartNode("步驟1", 50, 150, 100, 50)
node3 = FlowChartNode("結束", 50, 250, 100, 50) scene.addItem(node1)
scene.addItem(node2)
scene.addItem(node3) arrow1 = Arrow(node1, node2)
arrow2 = Arrow(node2, node3) scene.addItem(arrow1)
scene.addItem(arrow2) view = QGraphicsView(scene)
view.show() sys.exit(app.exec_())
在這個例子中,我們定義了一個 FlowChartNode
類來表示流程圖中的節點,該類繼承自 QGraphicsRectItem
。然后,我們創建了一個 QGraphicsScene
來容納這些節點,并使用 QGraphicsView
顯示它們。
樹狀圖
在 PyQtGraph 中創建樹狀圖(或樹形結構圖)通常不是直接支持的,因為 PyQtGraph 主要用于數據可視化,如繪制折線圖、散點圖等。但是,您可以使用 PyQt5 的 QTreeView
和 QStandardItemModel
來創建一個樹狀圖界面。
以下是使用 PyQt5 創建樹狀圖的示例代碼:
編寫代碼以創建樹狀圖:
import sys
from PyQt5.QtWidgets import QApplication, QTreeView
from PyQt5.QtGui import QStandardItem, QStandardItemModel app = QApplication(sys.argv) # 創建標準項模型
model = QStandardItemModel()
rootNode = model.invisibleRootItem() # 創建節點
parent1 = QStandardItem('父節點1')
child1 = QStandardItem('子節點1')
child2 = QStandardItem('子節點2')
parent1.appendRow(child1)
parent1.appendRow(child2) parent2 = QStandardItem('父節點2')
child3 = QStandardItem('子節點3')
parent2.appendRow(child3) rootNode.appendRow(parent1)
rootNode.appendRow(parent2) # 創建樹視圖并設置模型 treeView = QTreeView()
treeView.setHeaderHidden(True) treeView.setModel(model)
treeView.expandAll() # 展開所有節點 # 顯示樹視圖
treeView.show() sys.exit(app.exec_())
在這個例子中,我們創建了一個 QStandardItemModel
來存儲樹形數據,然后向模型中添加了幾個 QStandardItem
作為節點。QTreeView
用于展示這個模型。每個節點都可以有子節點,形成樹形結構。
網絡圖
在 PyQtGraph 中直接繪制網絡圖(Graph Visualization)并不直接支持,因為 PyQtGraph 主要用于繪制二維和三維的數據可視化圖形,如折線圖、散點圖等。但是,您可以結合使用 PyQt 和其他 Python 圖形庫,如 NetworkX,來創建和顯示網絡圖。
以下是一個使用 PyQt5 和 NetworkX 創建網絡圖的示例:
編寫代碼以創建網絡圖:
import sysimport networkx as nximport matplotlib.pyplot as pltfrom PyQt5.QtWidgets import QApplication, QMainWindow, QSizePolicy, QWidget, QVBoxLayoutfrom matplotlib.backends.backend_qt5agg import FigureCanvasQTAgg as FigureCanvasclass NetworkGraph(QWidget):def __init__(self, parent=None):super(NetworkGraph, self).__init__(parent)self.figure, self.ax = plt.subplots()self.canvas = FigureCanvas(self.figure)self.canvas.setSizePolicy(QSizePolicy.Expanding, QSizePolicy.Expanding)self.canvas.updateGeometry()layout = QVBoxLayout()layout.addWidget(self.canvas)self.setLayout(layout)self.draw_graph()def draw_graph(self):# 創建一個網絡圖G = nx.karate_club_graph()# 繪制網絡圖pos = nx.spring_layout(G)nx.draw(G, pos, ax=self.ax, with_labels=True, node_color='skyblue', edge_color='gray')# 更新畫布self.canvas.draw()app = QApplication(sys.argv)mainWindow = QMainWindow()mainWindow.setCentralWidget(NetworkGraph())mainWindow.show()sys.exit(app.exec_())
在這個示例中,我們創建了一個名為 NetworkGraph
的自定義 QWidget,用于顯示由 NetworkX 生成的網絡圖。使用 NetworkX 創建并配置圖形,然后使用 Matplotlib 進行繪圖。最后,將 Matplotlib 圖形嵌入到 PyQt5 應用程序窗口中。
氣泡圖
在 PyQtGraph 中繪制氣泡圖可以通過使用 ScatterPlotItem
類并調整點的大小來實現。氣泡圖是散點圖的一種變體,其中每個點的大小可以代表數據的一個額外維度。
以下是使用 PyQtGraph 創建氣泡圖的步驟和示例代碼:
編寫代碼以繪制氣泡圖:
import sys
import numpy as np
from PyQt5 import QtWidgets
import pyqtgraph as pg # 創建一個應用程序實例
app = QtWidgets.QApplication(sys.argv) # 創建一個主窗口
mainWindow = QtWidgets.QMainWindow() # 創建一個繪圖控件
plotWidget = pg.PlotWidget()
plotWidget.setBackground("w")
mainWindow.setCentralWidget(plotWidget) # 準備數據
x = np.random.rand(100) * 10
y = np.random.rand(100) * 10
sizes = np.random.rand(100) * 50 # 氣泡的大小 # 創建散點圖項目
scatterPlotItem = pg.ScatterPlotItem(pen=pg.mkPen(None), brush="#dcbeff") # 現在使用 setData 設置點的坐標和大小
scatterPlotItem.setData(x, y, size=sizes) # 將散點圖添加到繪圖控件
plotWidget.addItem(scatterPlotItem) # 顯示主窗口
mainWindow.show() # 啟動應用程序的事件循環
sys.exit(app.exec_())
在這個例子中,我們使用 ScatterPlotItem
創建了一個散點圖,并通過改變每個點的大小(size
參數)來創建一個氣泡圖效果。x
和 y
是數據點的坐標,sizes
數組決定了每個點的大小。
地圖圖表
在 PyQt 中繪制地圖圖表通常需要結合使用地理信息系統(GIS)相關的庫,例如 GeoPandas、Folium 或 PyQGIS。這些庫可以處理地理數據并生成地圖,但是它們不是 PyQtGraph 的一部分。另一種選擇是使用 QGIS,這是一個完整的地理信息系統平臺,它可以與 PyQt 結合使用。
以下是一個使用 Python、PyQt5 和 Folium 創建交互式地圖圖表的基本示例:
編寫代碼以創建地圖圖表:
import sys
import os
import folium
from PyQt5.QtWidgets import QApplication, QMainWindow, QWidget
from PyQt5.QtWebEngineWidgets import QWebEngineView
from PyQt5.QtCore import QUrl class MapWidget(QWidget): def __init__(self, parent=None): super().__init__(parent) self.view = QWebEngineView(self) self.init_ui() def init_ui(self): # 創建一個 Folium 地圖,您可以調整 zoom_start 來設置初始縮放級別 m = folium.Map(location=[45.5236, -122.6750], zoom_start=13) # 獲取當前文件夾的絕對路徑 dirname = os.path.abspath(os.path.dirname(__file__)) # 保存地圖為 HTML 文件 map_path = os.path.join(dirname, 'map.html') m.save(map_path) # 在 QWebEngineView 中加載 HTML self.view.load(QUrl.fromLocalFile(map_path)) # 設置 QWebEngineView 控件的最小尺寸 self.view.setMinimumSize(800, 600) # 例如,設置為寬800像素,高600像素 self.view.show() app = QApplication(sys.argv)
mainWindow = QMainWindow()
mapWidget = MapWidget() # 設置主窗口的初始大小
mainWindow.resize(800, 600) # 可以根據需要調整這個尺寸 mainWindow.setCentralWidget(mapWidget)
mainWindow.show()
sys.exit(app.exec_())
在這個示例中,我們使用 Folium 創建了一個簡單的地圖,并將其保存為一個 HTML 文件。然后我們使用 PyQt5 的 QWebEngineView
小部件加載并顯示這個 HTML 文件,從而在 PyQt 應用程序中嵌入了地圖。
桑基圖
桑基圖是一種特殊的流程圖,它用于表示數據流和傳輸。在 PyQtGraph 中直接繪制桑基圖并不支持,因為它主要用于繪制二維和三維的數據可視化圖形,如折線圖、散點圖等。然而,您可以使用其他的Python庫,如 matplotlib
,來創建桑基圖,并將其嵌入到 PyQt 應用程序中。
以下是一個使用 Python、PyQt5 和 Matplotlib 創建桑基圖的基本示例:
編寫代碼以創建桑基圖:
import sysfrom PyQt5.QtWidgets import QApplication, QMainWindow, QVBoxLayout, QWidgetfrom matplotlib.backends.backend_qt5agg import FigureCanvasQTAgg as FigureCanvasimport matplotlib.pyplot as pltfrom matplotlib.sankey import Sankeyclass SankeyWidget(QWidget):def __init__(self, parent=None):super(SankeyWidget, self).__init__(parent)self.figure, self.ax = plt.subplots()self.canvas = FigureCanvas(self.figure)layout = QVBoxLayout()layout.addWidget(self.canvas)self.setLayout(layout)self.draw_sankey()def draw_sankey(self):# 創建桑基圖sankey = Sankey(ax=self.ax)sankey.add(flows=[1, -1, 0.5, -0.5], labels=['', '', '', ''], orientations=[0, 0, 1, -1])sankey.finish()# 更新畫布self.canvas.draw()app = QApplication(sys.argv)mainWindow = QMainWindow()mainWindow.setCentralWidget(SankeyWidget())mainWindow.show()sys.exit(app.exec_())
在這個示例中,我們定義了一個 SankeyWidget
類來展示桑基圖。使用 Matplotlib 創建桑基圖,并將其嵌入到 PyQt5 應用程序中。
組合圖
在 PyQtGraph 中創建組合圖(例如,將折線圖和柱狀圖組合在一起)可以通過在同一個繪圖控件(PlotWidget
)中添加多個圖表元素來實現。這樣,您可以在同一個坐標軸上或在相互關聯的坐標軸上展示不同類型的數據。
以下是一個示例,展示如何在 PyQtGraph 中創建一個組合了折線圖和柱狀圖的組合圖:
編寫代碼以創建組合圖:
import sys
import numpy as np
from PyQt5 import QtWidgets
import pyqtgraph as pg# 創建一個應用程序實例
app = QtWidgets.QApplication(sys.argv)# 創建一個主窗口
mainWindow = QtWidgets.QMainWindow()# 創建一個繪圖控件
plotWidget = pg.PlotWidget()
plotWidget.setBackground('w')
mainWindow.setCentralWidget(plotWidget)# 準備數據
x = np.arange(10)
y1 = np.random.randint(1, 20, size=10) # 柱狀圖的數據
y2 = np.random.randint(1, 20, size=10) # 折線圖的數據# 創建柱狀圖項目
barGraphItem = pg.BarGraphItem(x=x, height=y1, width=0.6, brush='#fffac8')
plotWidget.addItem(barGraphItem)# 創建折線圖項目
plotWidget.plot(x, y2, pen=pg.mkPen(color='#dcbeff', width=2))# 顯示主窗口
mainWindow.show()# 啟動應用程序的事件循環
sys.exit(app.exec_())
在這個示例中,我們首先創建了一個包含柱狀圖和折線圖的 PlotWidget
。BarGraphItem
用于柱狀圖,而 plot
方法用于折線圖。通過將它們添加到同一個 PlotWidget
中,我們可以將兩種圖表組合在一起顯示。
股票圖
在 PyQtGraph 中繪制股票圖(通常指蠟燭圖或OHLC圖)需要一些額外的步驟,因為這需要特殊的圖表來表示股票的開盤價、最高價、最低價和收盤價。PyQtGraph 提供了 CandlestickItem
類來創建這種類型的圖表。
以下是使用 PyQtGraph 創建股票圖的步驟和示例代碼:
編寫代碼以繪制股票圖:
import sys
import numpy as np
from PyQt5 import QtWidgets
import pyqtgraph as pg class CandlestickItem(pg.GraphicsObject): def __init__(self, data): pg.GraphicsObject.__init__(self) self.data = data # data應該是一個包含(open, high, low, close)的列表 self.generatePicture() def generatePicture(self): self.picture = pg.QtGui.QPicture() p = pg.QtGui.QPainter(self.picture) p.setPen(pg.mkPen('b')) # 設置蠟燭圖的顏色 w = 0.3 for (t, open, high, low, close) in self.data: p.drawLine(pg.QtCore.QPointF(t, low), pg.QtCore.QPointF(t, high)) if open > close: p.setBrush(pg.mkBrush('g')) else: p.setBrush(pg.mkBrush('r')) p.drawRect(pg.QtCore.QRectF(t - w, open, w * 2, close - open)) p.end() def paint(self, p, *args): p.drawPicture(0, 0, self.picture) def boundingRect(self): return pg.QtCore.QRectF(self.picture.boundingRect()) # 創建一個應用程序實例
app = QtWidgets.QApplication(sys.argv) # 創建一個主窗口
mainWindow = QtWidgets.QMainWindow() # 創建一個繪圖控件
plotWidget = pg.PlotWidget()
plotWidget.setBackground("w")
mainWindow.setCentralWidget(plotWidget) # 準備數據
data = [ # 示例數據:(時間, 開盤價, 最高價, 最低價, 收盤價) (1, 10, 15, 5, 13), (2, 13, 20, 10, 15), (3, 15, 17, 13, 16), (4, 16, 19, 14, 10), # ...
] # 創建蠟燭圖項目
item = CandlestickItem(data)
plotWidget.addItem(item) # 顯示主窗口
mainWindow.show() # 啟動應用程序的事件循環
sys.exit(app.exec_())
在這個示例中,我們首先定義了一個 CandlestickItem
類來創建股票圖。該類繼承自 GraphicsObject
,并且重寫了繪圖方法來繪制蠟燭圖。數據格式是一個元組列表,每個元組代表一個時間點上的開盤價、最高價、最低價和收盤價。
甘特圖
在 PyQtGraph 中創建甘特圖需要一些額外的工作,因為它主要用于繪制二維和三維的數據可視化圖形,如折線圖、散點圖等,而不直接支持甘特圖。但是,您可以使用 PyQt 的基本圖形功能來手動繪制甘特圖。
以下是使用 PyQt5 創建簡單甘特圖的示例代碼:
編寫代碼以創建甘特圖:
import sys
from PyQt5.QtWidgets import QApplication, QGraphicsScene, QGraphicsView, QGraphicsRectItem, QGraphicsTextItem
from PyQt5.QtGui import QColor, QPen, QFont
from PyQt5.QtCore import QRectF class GanttChartItem(QGraphicsRectItem): def __init__(self, text, start, duration, row, color, parent=None): super(GanttChartItem, self).__init__(parent) # 設置矩形的尺寸和位置 self.setRect(QRectF(start, row * 50, duration, 30)) self.setBrush(QColor(color)) self.setPen(QPen(QColor('black'), 2)) # 添加邊框 # 添加文本標簽 text_item = QGraphicsTextItem(text, self) text_item.setFont(QFont('Arial', 10)) text_item.setDefaultTextColor(QColor('black')) text_item.setPos(start + 2, row * 50 + 5) app = QApplication(sys.argv) # 創建場景
scene = QGraphicsScene() # 創建甘特圖條目
ganttItem1 = GanttChartItem("項目1", 0, 100, 0, '#78C0A8')
ganttItem2 = GanttChartItem("項目2", 50, 150, 1, '#F4D35E')
ganttItem3 = GanttChartItem("項目3", 120, 100, 2, '#EE964B') # 將條目添加到場景
scene.addItem(ganttItem1)
scene.addItem(ganttItem2)
scene.addItem(ganttItem3) # 創建視圖
view = QGraphicsView(scene) # 設置合適的視圖尺寸
view.setSceneRect(0, 0, 400, 200)
view.setMinimumSize(600, 400) # 設置窗口標題
view.setWindowTitle("python") # 顯示視圖窗口
view.show() sys.exit(app.exec_())
在這個示例中,我們定義了一個 GanttChartItem
類來表示甘特圖中的單個任務。每個任務在水平方向上表示其持續時間,在垂直方向上表示不同的任務行。QGraphicsScene
用于容納這些任務,而 QGraphicsView
用于顯示它們。
平行坐標圖
在 PyQtGraph 中直接繪制平行坐標圖(Parallel Coordinates)并不直接支持,因為 PyQtGraph 主要用于繪制二維和三維的數據可視化圖形,如折線圖、散點圖等。然而,您可以使用其他的Python庫,如 matplotlib
或 pandas
,來創建平行坐標圖,并將其嵌入到 PyQt 應用程序中。
以下是一個使用 Python、PyQt5 和 Matplotlib 創建平行坐標圖的基本示例:
編寫代碼以創建平行坐標圖:
import sysimport pandas as pdimport matplotlib.pyplot as pltfrom PyQt5.QtWidgets import QApplication, QMainWindow, QVBoxLayout, QWidgetfrom matplotlib.backends.backend_qt5agg import FigureCanvasQTAgg as FigureCanvasfrom pandas.plotting import parallel_coordinatesclass ParallelCoordinatesWidget(QWidget):def __init__(self, parent=None):super(ParallelCoordinatesWidget, self).__init__(parent)self.figure, self.ax = plt.subplots()self.canvas = FigureCanvas(self.figure)layout = QVBoxLayout()layout.addWidget(self.canvas)self.setLayout(layout)self.draw_parallel_coordinates()def draw_parallel_coordinates(self):# 創建數據data = pd.DataFrame({'A': [1, 2, 3, 4],'B': [4, 3, 2, 1],'C': [2, 3, 4, 1],'D': [4, 1, 3, 2]})# 繪制平行坐標圖parallel_coordinates(data, 'A', ax=self.ax)# 更新畫布self.canvas.draw()app = QApplication(sys.argv)mainWindow = QMainWindow()mainWindow.setCentralWidget(ParallelCoordinatesWidget())mainWindow.show()sys.exit(app.exec_())
在這個示例中,我們定義了一個 ParallelCoordinatesWidget
類來展示平行坐標圖。使用 Pandas 和 Matplotlib 創建平行坐標圖,并將其嵌入到 PyQt5 應用程序中。
通過本系列教程,我們了解了如何使用PyQt5結合PyQtGraph和其他庫來創建一系列不同的圖表,從而使數據更加生動且易于理解。從基礎的圖表到復雜的GIS表示,PyQt5提供了廣泛的功能,以幫助開發者在Python中構建專業的數據可視化解決方案。