Python seaborn和networkx能否通过matplotlib集成到GUI中?
使用下面的代码,我可以在用pyqt5设计的gui中绘制基本matplotlib图(比如给它一个xs和ys列表,然后绘制点)。但是,我无法插入高级模块,例如seaborn或networkx(让我们重点介绍seaborn),这些模块利用matplotlib的绘图功能来显示使用这些功能生成的数据Python seaborn和networkx能否通过matplotlib集成到GUI中?,python,matplotlib,pyqt5,seaborn,subplot,Python,Matplotlib,Pyqt5,Seaborn,Subplot,使用下面的代码,我可以在用pyqt5设计的gui中绘制基本matplotlib图(比如给它一个xs和ys列表,然后绘制点)。但是,我无法插入高级模块,例如seaborn或networkx(让我们重点介绍seaborn),这些模块利用matplotlib的绘图功能来显示使用这些功能生成的数据 from PyQt5 import QtCore, QtGui, QtWidgets import numpy as np import pandas as pd import matplotlib.pypl
from PyQt5 import QtCore, QtGui, QtWidgets
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
class Ui_MainWindow(object):
def setupUi(self, MainWindow):
MainWindow.setObjectName("MainWindow")
MainWindow.resize(800, 600)
self.centralwidget = QtWidgets.QWidget(MainWindow)
self.centralwidget.setObjectName("centralwidget")
self.widget = MplWidget(self.centralwidget)
self.widget.setGeometry(QtCore.QRect(200, 110, 391, 311))
self.widget.setObjectName("widget")
self.label = QtWidgets.QLabel(self.centralwidget)
self.label.setGeometry(QtCore.QRect(250, 40, 231, 61))
self.label.setObjectName("label")
self.pushButton = QtWidgets.QPushButton(self.centralwidget)
self.pushButton.setGeometry(QtCore.QRect(50, 180, 113, 32))
self.pushButton.setObjectName("pushButton")
MainWindow.setCentralWidget(self.centralwidget)
self.menubar = QtWidgets.QMenuBar(MainWindow)
self.menubar.setGeometry(QtCore.QRect(0, 0, 800, 22))
self.menubar.setObjectName("menubar")
MainWindow.setMenuBar(self.menubar)
self.statusbar = QtWidgets.QStatusBar(MainWindow)
self.statusbar.setObjectName("statusbar")
MainWindow.setStatusBar(self.statusbar)
self.retranslateUi(MainWindow)
QtCore.QMetaObject.connectSlotsByName(MainWindow)
self.pushButton.clicked.connect(self.Graphitdude)
def Graphitdude(self):
Lister3 = pd.read_csv("Betadata.csv",index_col=[0])#just a collection of labels and assorted correlation values ranging from 0 to 1 to be constructed into a heatmap.
plot = sns.heatmap(Lister3) # This is the problematic function, it does it, and I can display it IN LINE but not in the gui canvas?
plt.yticks(rotation=0)
self.widget.canvas.ax.plot()#if passed discreet x and y values, it graphs it, but it doesnt like to pass the seaborn figure?
self.widget.canvas.draw()
def retranslateUi(self, MainWindow):
_translate = QtCore.QCoreApplication.translate
MainWindow.setWindowTitle(_translate("MainWindow", "MainWindow"))
self.label.setText(_translate("MainWindow", "<html><head/><body><p align=\"center\"><span style=\" font-size:24pt; font-weight:600;\">Test</span></p></body></html>"))
self.pushButton.setText(_translate("MainWindow", "PushButton"))
from mplwidget import MplWidget
if __name__ == "__main__":
import sys
app = QtWidgets.QApplication(sys.argv)
MainWindow = QtWidgets.QMainWindow()
ui = Ui_MainWindow()
ui.setupUi(MainWindow)
MainWindow.show()
sys.exit(app.exec_())
我的最佳想法是,这些函数正在设计它们自己的matplotlib图(或子图,不确定),并且我尝试过的方法无法将该图提供给小部件代码
sns.heatmap(xxxx)返回“ax”,应该可以被mplwidget.py脚本使用,对吗?我可以将这些传递到画布以显示seaborn图形吗 根据:
seaborn.heatmap(数据,vmin=None,vmax=None,cmap=None,center=None,robust=False,annot=None,fmt='.2g',annot_-kws=None,linecolor='white',cbar=True,cbar_-kws=None,cbar_-ax=None,square=False,xticklabels='auto',yticklabels='auto',mask=None,ax=None,ax=None,**kwargs)
[……]
ax:matplotlib轴,可选
要在其中绘制绘图的轴,否则使用当前活动的轴
因此,您只需将mplnavas
的AxesSubplot
作为参数ax传递:
def Graphitdude(self):
Lister3 = pd.read_csv("Betadata.csv",index_col=[0])
plot = sns.heatmap(Lister3, ax=self.widget.canvas.ax)
plt.yticks(rotation=0)
self.widget.canvas.draw()
我使用了许多类似于热图的函数,并始终提供该参数。您好,这是一个有趣的问题,但由此可知:
我无法插入高级模块
,很难理解您面临的确切问题。你能详细说明一下吗?我的猜测是,您可以获取任何图形的画布,包括使用seaborn或networkx生成的画布,然后将该画布推到您想要的任何位置。此解决方案效果很好,但必须使用MplCanvas会在清除axis元素时产生一个小问题吗?(我为每个绘图生成一个新的图例,但不知道如何清除它)我可以从不同的数据集多次绘制热图本身,但每次它生成一个新的轴元素以放入图例。如何“重置”整个MplCanvas?
def Graphitdude(self):
Lister3 = pd.read_csv("Betadata.csv",index_col=[0])
plot = sns.heatmap(Lister3, ax=self.widget.canvas.ax)
plt.yticks(rotation=0)
self.widget.canvas.draw()