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):当图形的阴影质量设置发射了改变,则发射此信号。 ?Q3DBarsQ3DBars类提供用于渲染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 ClassQBar3DSeries类表示3D条形图中的数据序列。它管理系列特定的视觉元素以及序列数据(通过数据代理)。如果没有为该序列显式设置任何数据代理,则该序列将创建一个默认代理。设置另一个代理将破坏现有代理以及所有添加到其中的数据。
QBar3DSeries常用函数:
??setDataProxy(self, proxy):保存活动数据代理。 ?setMeshAngle(self, angle):设置数据序列旋转角度(以度为单位)。 ?setSelectedBar(self,position):设置选中的条形图序列。 ?QBar3DSeries常用信号:
??dataProxyChanged(self, proxy): 当数据代理发生了改变,发出此信号。 ?meshAngleChanged(self, angle):当数据序列的旋转角度发生了改变,发出此信号。 ?selectedBarChanged(self, position):当选中的条形图序列发生改变时,发出此信号。 ?构建一个Q3DBars图形示例代码展示了如果构建一个Q3DBars图形,完整代码如下:
import sysfrom PyQt5.QtCore import Qtfrom PyQt5.QtWidgets import QApplicationfrom 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柱状图的方法。