PyQt 和 Netgraph 可编辑图
PyQt and Netgraph Editable Graph
我已经有一个与 Netgraph 一起工作的 PyQt 应用程序。
我可以移动顶点和边,给出以下代码:
import sys
from PyQt5 import QtWidgets
import matplotlib
matplotlib.use("Qt5Agg")
from matplotlib.backends.backend_qt5agg import FigureCanvasQTAgg, NavigationToolbar2QT
from matplotlib.figure import Figure
from netgraph import InteractiveGraph
import networkx as nx
class MplCanvas(FigureCanvasQTAgg):
def __init__(self, parent=None, width=5, height=4, dpi=100):
super(MplCanvas, self).__init__(Figure(figsize=(width, height), dpi=dpi))
self.setParent(parent)
self.ax = self.figure.add_subplot(111)
graph = nx.house_x_graph()
self.plot_instance = InteractiveGraph(graph, ax=self.ax)
class MainWindow(QtWidgets.QMainWindow):
def __init__(self, *args, **kwargs):
super(MainWindow, self).__init__(*args, **kwargs)
self.canvas = MplCanvas(self, width=5, height=4, dpi=100)
self.toolbar = NavigationToolbar2QT(self.canvas, self)
widget = QtWidgets.QWidget()
self.setCentralWidget(widget)
layout = QtWidgets.QVBoxLayout(widget)
layout.addWidget(self.toolbar)
layout.addWidget(self.canvas)
def main():
app = QtWidgets.QApplication(sys.argv)
w = MainWindow()
w.show()
app.exec_()
if __name__ == "__main__":
main()
Netgraph EditableGraph 允许添加或删除顶点和边,例如。但是,在前面的代码中,如果从 InteractiveGraph
更改为 EditableGraph
,则没有任何更改。
如果你运行下面的例子:
import matplotlib.pyplot as plt
import networkx as nx
from netgraph import EditableGraph
g = nx.house_x_graph()
fig, ax = plt.subplots(figsize=(10, 10))
plot_instance = EditableGraph(g)
plt.show()
点击每个顶点或边,然后按删除按钮,它就会被删除。
我希望在 PyQt 中有同样的行为 window。我不确定缺少什么。
我在打开 issue at netgraph repo 时得到了一些帮助,最后我得到了以下算法:
import sys
import matplotlib; matplotlib.use("Qt5Agg")
from PyQt5 import QtWidgets, QtCore # <- additional import
from matplotlib.backends.backend_qt5agg import FigureCanvasQTAgg, NavigationToolbar2QT
from matplotlib.figure import Figure
from netgraph import EditableGraph
class MplCanvas(FigureCanvasQTAgg):
def __init__(self, parent=None, width=5, height=4, dpi=100):
super(MplCanvas, self).__init__(Figure(figsize=(width, height), dpi=dpi))
self.setParent(parent)
self.ax = self.figure.add_subplot(111)
self.graph = EditableGraph([(0, 1)], ax=self.ax)
class MainWindow(QtWidgets.QMainWindow):
def __init__(self, *args, **kwargs):
super(MainWindow, self).__init__(*args, **kwargs)
self.canvas = MplCanvas(self, width=5, height=4, dpi=100)
# ----------------------------------------
# Enable key_press_event events:
# https://github.com/matplotlib/matplotlib/issues/707/#issuecomment-4181799
self.canvas.setFocusPolicy(QtCore.Qt.ClickFocus)
self.canvas.setFocus()
# ----------------------------------------
self.toolbar = NavigationToolbar2QT(self.canvas, self)
widget = QtWidgets.QWidget()
self.setCentralWidget(widget)
layout = QtWidgets.QVBoxLayout(widget)
layout.addWidget(self.toolbar)
layout.addWidget(self.canvas)
def main():
app = QtWidgets.QApplication(sys.argv)
w = MainWindow()
w.show()
app.exec_()
if __name__ == "__main__":
main()
我已经有一个与 Netgraph 一起工作的 PyQt 应用程序。
我可以移动顶点和边,给出以下代码:
import sys
from PyQt5 import QtWidgets
import matplotlib
matplotlib.use("Qt5Agg")
from matplotlib.backends.backend_qt5agg import FigureCanvasQTAgg, NavigationToolbar2QT
from matplotlib.figure import Figure
from netgraph import InteractiveGraph
import networkx as nx
class MplCanvas(FigureCanvasQTAgg):
def __init__(self, parent=None, width=5, height=4, dpi=100):
super(MplCanvas, self).__init__(Figure(figsize=(width, height), dpi=dpi))
self.setParent(parent)
self.ax = self.figure.add_subplot(111)
graph = nx.house_x_graph()
self.plot_instance = InteractiveGraph(graph, ax=self.ax)
class MainWindow(QtWidgets.QMainWindow):
def __init__(self, *args, **kwargs):
super(MainWindow, self).__init__(*args, **kwargs)
self.canvas = MplCanvas(self, width=5, height=4, dpi=100)
self.toolbar = NavigationToolbar2QT(self.canvas, self)
widget = QtWidgets.QWidget()
self.setCentralWidget(widget)
layout = QtWidgets.QVBoxLayout(widget)
layout.addWidget(self.toolbar)
layout.addWidget(self.canvas)
def main():
app = QtWidgets.QApplication(sys.argv)
w = MainWindow()
w.show()
app.exec_()
if __name__ == "__main__":
main()
Netgraph EditableGraph 允许添加或删除顶点和边,例如。但是,在前面的代码中,如果从 InteractiveGraph
更改为 EditableGraph
,则没有任何更改。
如果你运行下面的例子:
import matplotlib.pyplot as plt
import networkx as nx
from netgraph import EditableGraph
g = nx.house_x_graph()
fig, ax = plt.subplots(figsize=(10, 10))
plot_instance = EditableGraph(g)
plt.show()
点击每个顶点或边,然后按删除按钮,它就会被删除。
我希望在 PyQt 中有同样的行为 window。我不确定缺少什么。
我在打开 issue at netgraph repo 时得到了一些帮助,最后我得到了以下算法:
import sys
import matplotlib; matplotlib.use("Qt5Agg")
from PyQt5 import QtWidgets, QtCore # <- additional import
from matplotlib.backends.backend_qt5agg import FigureCanvasQTAgg, NavigationToolbar2QT
from matplotlib.figure import Figure
from netgraph import EditableGraph
class MplCanvas(FigureCanvasQTAgg):
def __init__(self, parent=None, width=5, height=4, dpi=100):
super(MplCanvas, self).__init__(Figure(figsize=(width, height), dpi=dpi))
self.setParent(parent)
self.ax = self.figure.add_subplot(111)
self.graph = EditableGraph([(0, 1)], ax=self.ax)
class MainWindow(QtWidgets.QMainWindow):
def __init__(self, *args, **kwargs):
super(MainWindow, self).__init__(*args, **kwargs)
self.canvas = MplCanvas(self, width=5, height=4, dpi=100)
# ----------------------------------------
# Enable key_press_event events:
# https://github.com/matplotlib/matplotlib/issues/707/#issuecomment-4181799
self.canvas.setFocusPolicy(QtCore.Qt.ClickFocus)
self.canvas.setFocus()
# ----------------------------------------
self.toolbar = NavigationToolbar2QT(self.canvas, self)
widget = QtWidgets.QWidget()
self.setCentralWidget(widget)
layout = QtWidgets.QVBoxLayout(widget)
layout.addWidget(self.toolbar)
layout.addWidget(self.canvas)
def main():
app = QtWidgets.QApplication(sys.argv)
w = MainWindow()
w.show()
app.exec_()
if __name__ == "__main__":
main()