PyVista:为什么回调只绘制3d实体,而不是第二次绘制2d实体?



我有一个问题,希望您能帮助我。我在下面放了一个小的MCVE。

当你第一次单击按钮时,你可以看到3d数据(add_mesh, add_points)和2d数据(chart.scatter)显示出来。如果你再次点击它,只显示3d数据。

有人知道为什么会这样吗?

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_())

我想你已经发现了一个bug,谢谢你的好例子!现在在PyVista 0.35.2版本中修复了这个问题,更新包应该可以使事情正常工作。以下答案的原始(前缀)版本


图表的情况是,它们存储在一个名为__charts的私有属性中,通过绘图仪的Renderer上的私有属性_charts来访问。也就是说,self.plotter.renderer._charts会给你一个私有的pyvista.plotting.charts.Charts对象。这是通过plotter.add_chart()添加的单个图表的实际跟踪。

但是调用plotter.clear()并不能清除这个图表列表。我还不清楚这到底是如何与重新绘制混淆的(我怀疑某种程度上早期的图表阻止了新图表的添加,但新的图表已经从绘图仪中删除了)。但是在plotter.clear()上清除图表也是有意义的,如果我通过编辑PyVista的库代码来做到这一点,你的问题就会消失。

我已经在PyVista中打开了一个拉请求来修复这个问题(或者了解我是否错了这是一个bug)。在这种情况发生并发布修复之前,您可以在回调代码

中破解您自己代码中的等效步骤:
self.plotter.clear()
self.plotter.renderer._charts.deep_clean()  # <- hacky workaround

不用说,这是一个临时度量,在您自己的代码中是非常糟糕的形式。一旦我们的新版本修复了这个问题,你就应该删除这一行。

最新更新