Qt中提供一個三維數據可視化模塊(Data Visualization),可以繪製三維柱狀圖、三維散點圖、三維曲面等。在PyQt5的預設安裝包中,並為集成數據可視化模塊,要使用它,需要另行安裝PyQtDataVisualization包。運行命令
pip install PyQtDataVisualization安裝該模塊,就可以使用了。
QAbstract3DGraph
無論是三維柱狀圖,三維散點圖,還是三維曲面等圖形,它們都繼承自QAbstract3DGraph類,QAbstract3DGraph類為圖形提供了一個窗口和渲染循環。
QAbstract3DGraph是QWindow的子類,並為它的繼承類提供渲染循環,在程序中不應該直接使用這個類,而是使用其子類。
除OpenGL ES2環境(Qt Data Visualization不支持抗鋸齒)外,C ++上的抗鋸齒默認情況下處於打開狀態。
注意:
QAbstract3DGraphQt::FramelessWindowHint默認情況下將窗口標誌設置為打開。如果要將圖形窗口顯示為帶有常規窗口框架的獨立窗口,請在構造圖形後清除此標誌。例如:
bars = Q3DBars()
bars.setFlags(bars.flags() ^ Qt.FramelessWindowHint)QAbstract3DGraph常用方法:
- scene(self):返回場景Q3DScene()對象。
- setActiveInputHandler(self, inputHandler):將inputHandler設置為圖形中使用的活動輸入處理程序。
- setActiveTheme(self, theme):將theme設置為要用於圖形的活動主題。
- setAspectRatio(self, ratio):設置圖形在水平面上的最長軸與y軸之間的比例。默認為2.0。此設置對Q3DBars無效。
- setHorizontalAspectRatio(self, ratio):x軸和z軸之間的圖形縮放比例。值0.0表示自動縮放,預設值為0.0。
- setLocale(self, locale):設置用于格式化各種數字標籤的語言環境。
- setMargin(self, margin):設置用於可繪製圖形區域邊緣和圖形背景邊緣之間的空間的絕對值。如果邊距值為負,則邊距是自動確定的,並且可以根據系列中項目的大小和圖形的類型而變化。如果圖形寬高比未從默認值更改,則該值將解釋為y軸範圍的一部分。默認為-1.0。
- setMeasureFps(self, enable):設置是否連續進行渲染而不是按需進行渲染。
- setOptimizationHints(self, hints):設置默認模式還是靜態模式還是渲染優化模式。默認模式以合理的性能水平提供完整的功能集。靜態模式可優化圖形渲染,是大型不變數據集的理想選擇。動態數據更改和項目輪換速度較慢。沒有優化選擇,因此不建議將靜態模式與海量數據集一起使用。靜態優化僅適用於散點圖。
- setOrthoProjection(self, enable):設置是否使用正投影來顯示圖形。
- setPolar(self, enable):設置是否將水平軸更改為極坐標軸。如果為True,則x軸成為角軸,z軸成為徑向軸。極坐標模式不適用於條形圖。默認為False。
- setRadialLabelOffset(self, offset):設置徑向極坐標軸的軸標籤的歸一化水平偏移。該值0.0指示應在0角角度軸網格線旁邊繪製標籤。該值1.0表示標籤是在圖形背景邊緣的通常位置繪製的。默認為1.0。
- setReflection(self, enable):設置是否打開floor反射。僅影響Q3DBars。
setReflectivity(self, reflectivity):設置floor反射率,較大的數字會使地板更具反射性。有效範圍是[0…1]。默認為0.5。僅影響Q3DBars。
- setSelectionMode(self, mode):設置圖形條目的選擇方式。
- setShadowQuality(self, quality):設置陰影的質量級別。
QAbstract3DGraph常用信號:
- activeInputHandlerChanged(self, inputHandler): 當圖形的活動輸入處理程序發生改變時,發出該信號。
- activeThemeChanged(self, theme):當圖形的活動主題發生改變時,發射該信號。
- aspectRatioChanged(self, ratio):當圖形在水平面上的最長軸與y軸之間的比例發生改變時,發射此信號。
- currentFpsChanged(self, fps):噹噹前的圖形渲染幀率發生改變時,發射該信號。
- horizontalAspectRatioChanged(self, ratio):當x軸和z軸之間的圖形縮放比例發生改變時,發射此信號。
- localeChanged(self, locale):當用于格式化各種數字標籤的語言環境發生變化時,發射此信號。
- marginChanged(self, margin): 當可繪製圖形區域邊緣和圖形背景邊緣之間的空間的間距發生變化時,發射此信號。
- measureFpsChanged(self, enabled):當渲染模式發生改變時,發射此信號。
- optimizationHintsChanged(self, hints):當優化模式發生改變時,發射此信號。
- orthoProjectionChanged(self, enabled):當啟用/禁用正投影來顯示圖形時,發射此信號。
- polarChanged(self, enabled):當水平軸更改為極坐標軸或取消極坐標軸時,發射此信號。
- queriedGraphPositionChanged(self, data):當查詢到圖形的位置值發生改變時,發射此信號。
- radialLabelOffsetChanged(self, offset):當徑向極坐標軸的軸標籤的歸一化水平偏移值發生改變時,發射此信號。
- reflectionChanged(self, enabled):當啟用/禁用floor發射時,發射此信號。
- reflectivityChanged(self, reflectivity):當floor發射的反射率發生改變,發射此信號。
- selectedElementChanged(self, type):當圖形中圖形中選擇的元素髮生改變時,發射此信號。
- selectionModeChanged(self, mode):當圖形的選擇模式發生了改變,則發射此信號。
- shadowQualityChanged(self, quality):當圖形的陰影質量設置發射了改變,則發射此信號。
Q3DBars
Q3DBars類提供用於渲染3D柱狀圖的方法。使用Q3DBars可以開發3D柱狀圖,並通過旋轉場景來查看它們。按住滑鼠右鍵並移動滑鼠即可完成旋轉。縮放是通過滑鼠滾輪完成的。選擇(如果啟用)是通過滑鼠左鍵完成的。可以通過單擊滑鼠滾輪將場景重置為默認攝像機視圖。
如果未顯示地給Q3DBars設置坐標軸,Q3DBars會創建沒有標籤的臨時默認坐標軸。可以通過相應方法訪問這些默認坐標軸,一旦為某一方向顯示地設置了坐標軸,則該方向上的默認坐標軸會自動被摧毀。
Q3DBars支持同時顯示多個數據序列。並且不要求所有的數據序列都具有相同數量的行和列。如果未明確定義行和列的坐標軸,則行和列的標籤數據取自圖形中第一個添加的數據序列。
Q3DBars常用方法:
- addAxis(self, axis): 將axis添加到圖形。通過addAxis添加的軸尚未使用,addAxis僅用於將axis的所有權給與圖形。axis不能為空或添加到另一個圖形中。
- addSeries(self, series):將3D條狀圖形序列series添加到圖形中。一個圖形可以包含多個圖形序列,但只能包含一組軸,因此所有序列的行和列都必須匹配才能使可視化數據有意義。如果圖形具有多個可見序列,則在標籤未顯式設置為軸的情況下,只有主圖形序列會在軸上生成行或列標籤。
- setBarSpacing(self, spacing):設置X和Z軸之間Bar的距離,預設為(1.0, 1.0)。
- setBarSpacingRelative(self, relative):設置間距是絕對值還是相對於Bar的厚度的。預設為True。
- setBarThickness(self, thicknessRatio):設置X和Z軸之間Bar的厚度,該值1.0表示條形圖的寬度是其深的0.5兩倍。預設值為1.0。
- setColumnAxis(self, axis):設置連接到活動列的坐標軸。
- setFloorLevel(self, level):設置Y軸數據坐標中條形圖的最低水平值,默認為0。
- setMultiSeriesUniform(self, uniform):設置是否要按比例將比例尺設置為單個圖形序列比例尺來縮放比例。預設為False。
- setPrimarySeries(self,series):設置圖形的主序列。
- setRowAxis(self, axis):設置連接到活動行的坐標軸。
- setValueAxis(self, axis):將有效值軸(Y軸)設置為axis。
Q3DBars常用信號:
- barSpacingChanged(self, spacing):當X和Z軸之間Bar的間距發生改變,發出此信號。
- barSpacingRelativeChanged(self, relative):當間距方式發生改變,發出此信號。
- barThicknessChanged(self, thicknessRatio):當Bar的厚度發生改變,發出此信號。
- columnAxisChanged(self, axis):當連接到活動列的坐標軸發生改變時,發出此信號。
- floorLevelChanged(self, level):當Y軸數據坐標中條形圖的最低水平值發生改變時,發出此信號。
- multiSeriesUniformChanged(self, uniform):當圖形序列的比例尺設置發生改變時,發出此信號。
- primarySeriesChanged(self, series):當圖形的主序列發生變化時,發出此信號。
- rowAxisChanged(self, axis):當連接到活動行的坐標軸發生改變時,發出此信號。
- selectedSeriesChanged(self, series):當所選的圖像序列發生改變時,發出此信號。
- valueAxisChanged(self, axis):當有效值軸(Y軸)發生改變時,發出此信號。
QBar3DSeries Class
QBar3DSeries類表示3D條形圖中的數據序列。它管理系列特定的視覺元素以及序列數據(通過數據代理)。如果沒有為該序列顯式設置任何數據代理,則該序列將創建一個默認代理。設置另一個代理將破壞現有代理以及所有添加到其中的數據。
QBar3DSeries常用函數:
- setDataProxy(self, proxy):保存活動數據代理。
- setMeshAngle(self, angle):設置數據序列旋轉角度(以度為單位)。
- setSelectedBar(self,position):設置選中的條形圖序列。
QBar3DSeries常用信號:
- dataProxyChanged(self, proxy): 當數據代理髮生了改變,發出此信號。
- meshAngleChanged(self, angle):當數據序列的旋轉角度發生了改變,發出此信號。
- selectedBarChanged(self, position):當選中的條形圖序列發生改變時,發出此信號。
構建一個Q3DBars圖形
示例代碼展示了如果構建一個Q3DBars圖形,完整代碼如下:
import sys
from PyQt5.QtCore import Qt
from PyQt5.QtWidgets import QApplication
from PyQt5.QtDataVisualization import Q3DBars, QBar3DSeries, QBarDataItem, Q3DCamera
if __name__ == '__main__':
app = QApplication(sys.argv)
bars = Q3DBars()
bars.setFlags(bars.flags() ^ Qt.FramelessWindowHint)
bars.rowAxis().setRange(0, 4)
series = QBar3DSeries()
data = []
data.append(QBarDataItem(1.0))
data.append(QBarDataItem(3.0))
data.append(QBarDataItem(7.5))
data.append(QBarDataItem(5.0))
data.append(QBarDataItem(2.2))
series.dataProxy().addRow(data)
bars.addSeries(series)
#調整相機位置,更好的角度來觀察柱狀圖
camera = bars.scene().activeCamera()
camera.setCameraPreset(Q3DCamera.CameraPresetIsometricRight)
bars.setTitle('實戰 Qt for Python: 3D柱狀圖演示')
bars.resize(480, 360)
bars.show()
sys.exit(app.exec()) 運行結果如下圖:
3D柱狀圖示例
本文知識點
- PyQt5預設安裝包為提供可視化模塊,要使用其可視化模塊,需要單獨安裝。
- QAbstract3DGraph類為圖形提供了一個窗口和渲染循環。
- Q3DBars類提供用於渲染3D柱狀圖的方法。
原創文章,作者:投稿專員,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/258718.html
微信掃一掃
支付寶掃一掃