You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

PyVista按钮回调二次触发时仅渲染3D实体不显示2D图表问题

问题描述
  • 运行基于pyvistaqt编写的交互程序时,首次点击触发按钮,add_mesh、add_points添加的3D模型、点云数据,以及chart.scatter添加的2D散点图均可正常渲染
  • 第二次及之后点击按钮,3D数据可以正常刷新显示,2D散点图表完全无法呈现
  • 最小复现代码如下:
import sys
import os
os.environ["QT_API"] = "pyqt5"

from qtpy import QtWidgets
import numpy as np
from pyvista import Chart2D
import pyvista as pv
from pyvistaqt import QtInteractor, MainWindow

class MyMainWindow(MainWindow):

    def __init__(self, parent=None, show=True):
        QtWidgets.QMainWindow.__init__(self, parent)
        self.frame = QtWidgets.QFrame()
        vlayout = QtWidgets.QVBoxLayout()
        self.plotter = QtInteractor(self.frame)
        btn1 = QtWidgets.QPushButton("Button 1", self)
        vlayout.addWidget(btn1)
        btn1.clicked.connect(self.buttonClicked)
        vlayout.addWidget(self.plotter)
        self.frame.setLayout(vlayout)
        self.setCentralWidget(self.frame)
        self.show()


    def buttonClicked(self):

        self.plotter.clear()
        data = np.random.standard_normal(size=(100, 3))
        actor = self.plotter.add_points(data)
        chart = Chart2D()
        _x = np.random.standard_normal(100)
        _y = np.random.standard_normal(100)
        chart.scatter(_x, _y, color="tab:blue", style="d", label="Scores")
        self.plotter.add_chart(chart)
        self.plotter.add_mesh(pv.Sphere())

if __name__ == '__main__':
    app = QtWidgets.QApplication(sys.argv)
    window = MyMainWindow()

    sys.exit(app.exec_())
产生原因

QtInteractor继承自pyvista的Plotter类,其clear()方法默认不会清除已添加的2D图表对象,对应参数charts的默认值为False。
第一次点击按钮后添加的Chart2D实例会一直驻留在plotter的2D上下文渲染层,第二次点击调用clear()时旧的图表对象没有被移除,后续新建的Chart2D实例添加时会和残留的旧图表产生渲染层冲突,且默认图表位置完全重叠,最终导致新的2D图表无法被正常绘制。

修复方案

调用clear()方法时显式传入charts=True参数,在清除3D场景内容的同时同步清除已有的2D图表对象,修改后按钮点击回调的代码段如下:

def buttonClicked(self):
    # 显式指定清除时同步移除2D图表
    self.plotter.clear(charts=True)
    data = np.random.standard_normal(size=(100, 3))
    actor = self.plotter.add_points(data)
    chart = Chart2D()
    _x = np.random.standard_normal(100)
    _y = np.random.standard_normal(100)
    chart.scatter(_x, _y, color="tab:blue", style="d", label="Scores")
    self.plotter.add_chart(chart)
    self.plotter.add_mesh(pv.Sphere())

修改后多次点击按钮,3D数据和2D散点图均可正常刷新。

内容的提问来源于stack exchange,提问作者Joe

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.26 17:06:27