I want to embed Kernel Density Estimation plot on PyQt5 GUI using Geoplot library. I found out how to embed simple matplot through canvas and followed same steps for KDE plot but all in vain. GUI opens but doesn't embed KDE. When I close qt GUI, the result is executed at the end of code. Here is my implemented code:
#Imports
import csv
import os
import sys
from os.path import dirname, realpath,join
from PyQt5.QtGui import QIcon
from PyQt5.QtWidgets import QApplication, QMainWindow,QVBoxLayout,QAction,QFileDialog, QWidget
from PyQt5.uic import loadUiType
from matplotlib.backends.backend_qt5agg import FigureCanvasQTAgg as FigureCanvas
from matplotlib.backends.backend_qt5agg import NavigationToolbar2QT as NavigationToolbar
from matplotlib.figure import Figure
from PyQt5 import QtCore, QtGui, QtWidgets
import subprocess
import pandas as pd
from matplotlib import pyplot as plt
from matplotlib import rcParams
import seaborn as sns
%matplotlib inline
import numpy as np
from pandas.plotting import register_matplotlib_converters
from datetime import datetime
from statsmodels.tsa.seasonal import STL
import geopandas as gpd
import geoplot as gplt
import geoplot.crs as gcrs
class Ui_Healthcare(object):
def setupUi(self, Healthcare):
Healthcare.setObjectName("Healthcare")
Healthcare.resize(779, 567)
self.centralwidget = QtWidgets.QWidget(Healthcare)
self.centralwidget.setObjectName("centralwidget")
self.All_Gen = QtWidgets.QRadioButton(self.centralwidget)
self.All_Gen.setGeometry(QtCore.QRect(30, 60, 95, 20))
self.All_Gen.setObjectName("All_Gen")
self.Male = QtWidgets.QRadioButton(self.centralwidget)
self.Male.setGeometry(QtCore.QRect(30, 90, 95, 20))
self.Male.setObjectName("Male")
self.Female = QtWidgets.QRadioButton(self.centralwidget)
self.Female.setGeometry(QtCore.QRect(30, 120, 95, 20))
self.Female.setObjectName("Female")
self.Undefined = QtWidgets.QRadioButton(self.centralwidget)
self.Undefined.setGeometry(QtCore.QRect(30, 150, 95, 20))
self.Undefined.setObjectName("Undefined")
self.groupBox = QtWidgets.QGroupBox(self.centralwidget)
self.groupBox.setGeometry(QtCore.QRect(20, 20, 161, 301))
self.groupBox.setStyleSheet("border-color: rgb(0, 0, 0);")
self.groupBox.setObjectName("groupBox")
self.groupBox_2 = QtWidgets.QGroupBox(self.groupBox)
self.groupBox_2.setGeometry(QtCore.QRect(0, 180, 161, 111))
self.groupBox_2.setObjectName("groupBox_2")
self.Age_1 = QtWidgets.QSpinBox(self.groupBox_2)
self.Age_1.setGeometry(QtCore.QRect(30, 30, 42, 22))
self.Age_1.setObjectName("Age_1")
self.Age_2 = QtWidgets.QSpinBox(self.groupBox_2)
self.Age_2.setGeometry(QtCore.QRect(100, 30, 42, 22))
self.Age_2.setObjectName("Age_2")
self.label = QtWidgets.QLabel(self.groupBox_2)
self.label.setGeometry(QtCore.QRect(80, 30, 21, 16))
self.label.setObjectName("label")
self.Age_3 = QtWidgets.QSpinBox(self.groupBox_2)
self.Age_3.setGeometry(QtCore.QRect(30, 70, 42, 22))
self.Age_3.setObjectName("Age_3")
self.label_3 = QtWidgets.QLabel(self.groupBox_2)
self.label_3.setGeometry(QtCore.QRect(80, 70, 21, 16))
self.label_3.setObjectName("label_3")
self.Age_4 = QtWidgets.QSpinBox(self.groupBox_2)
self.Age_4.setGeometry(QtCore.QRect(100, 70, 42, 22))
self.Age_4.setObjectName("Age_4")
self.Age_Lim1 = QtWidgets.QCheckBox(self.groupBox_2)
self.Age_Lim1.setGeometry(QtCore.QRect(10, 30, 16, 20))
self.Age_Lim1.setText("")
self.Age_Lim1.setObjectName("Age_Lim1")
self.Age_Lim2 = QtWidgets.QCheckBox(self.groupBox_2)
self.Age_Lim2.setGeometry(QtCore.QRect(10, 70, 16, 20))
self.Age_Lim2.setText("")
self.Age_Lim2.setObjectName("Age_Lim2")
self.TimeSeries = QtWidgets.QCheckBox(self.centralwidget, clicked = lambda: self.timeseries())
self.TimeSeries.setGeometry(QtCore.QRect(30, 360, 111, 20))
self.TimeSeries.setObjectName("TimeSeries")
self.KDE = QtWidgets.QCheckBox(self.centralwidget, clicked = lambda: self.KDEplot())
self.KDE.setGeometry(QtCore.QRect(30, 390, 121, 20))
self.KDE.setObjectName("KDE")
self.Histograms = QtWidgets.QCheckBox(self.centralwidget)
self.Histograms.setGeometry(QtCore.QRect(30, 420, 121, 20))
self.Histograms.setObjectName("Histograms")
self.Anomalies = QtWidgets.QCheckBox(self.centralwidget)
self.Anomalies.setGeometry(QtCore.QRect(30, 600, 121, 20))
self.Anomalies.setObjectName("Anomalies")
self.AllPatients = QtWidgets.QCheckBox(self.centralwidget)
self.AllPatients.setGeometry(QtCore.QRect(30, 330, 121, 20))
self.AllPatients.setObjectName("AllPatients")
self.line = QtWidgets.QFrame(self.centralwidget)
self.line.setGeometry(QtCore.QRect(180, -10, 20, 731))
self.line.setFrameShape(QtWidgets.QFrame.VLine)
self.line.setFrameShadow(QtWidgets.QFrame.Sunken)
self.line.setObjectName("line")
self.KDE_plot = QtWidgets.QFrame(self.centralwidget)
self.KDE_plot.setGeometry(QtCore.QRect(200, 40, 381, 411))
self.KDE_plot.setFrameShape(QtWidgets.QFrame.StyledPanel)
self.KDE_plot.setFrameShadow(QtWidgets.QFrame.Raised)
self.KDE_plot.setObjectName("KDE_plot")
#create a horizontal layout
self.horizontalLayout_4 = QtWidgets.QHBoxLayout(self.KDE_plot)
self.horizontalLayout_4.setObjectName("horizontalLayout_4")
#Canvas here
self.figure = plt.figure()
self.canvas = FigureCanvas(self.figure)
self.toolbar = NavigationToolbar(self.canvas)
#end of canvas
#Add canvas
self.horizontalLayout_4.addWidget(self.canvas)
self.horizontalLayout_4.addWidget(self.toolbar)
#end of horizontal layout
self.Smallframe1 = QtWidgets.QFrame(self.centralwidget)
self.Smallframe1.setGeometry(QtCore.QRect(600, 40, 161, 111))
self.Smallframe1.setFrameShape(QtWidgets.QFrame.StyledPanel)
self.Smallframe1.setFrameShadow(QtWidgets.QFrame.Raised)
self.Smallframe1.setObjectName("Smallframe1")
self.smallframe2 = QtWidgets.QFrame(self.centralwidget)
self.smallframe2.setGeometry(QtCore.QRect(600, 170, 151, 111))
self.smallframe2.setFrameShape(QtWidgets.QFrame.StyledPanel)
self.smallframe2.setFrameShadow(QtWidgets.QFrame.Raised)
self.smallframe2.setObjectName("smallframe2")
self.smallframe3 = QtWidgets.QFrame(self.centralwidget)
self.smallframe3.setGeometry(QtCore.QRect(600, 310, 151, 121))
self.smallframe3.setFrameShape(QtWidgets.QFrame.StyledPanel)
self.smallframe3.setFrameShadow(QtWidgets.QFrame.Raised)
self.smallframe3.setObjectName("smallframe3")
Healthcare.setCentralWidget(self.centralwidget)
self.menubar = QtWidgets.QMenuBar(Healthcare)
self.menubar.setGeometry(QtCore.QRect(0, 0, 779, 21))
self.menubar.setObjectName("menubar")
self.menuFile = QtWidgets.QMenu(self.menubar)
self.menuFile.setObjectName("menuFile")
self.menuEdit = QtWidgets.QMenu(self.menubar)
self.menuEdit.setObjectName("menuEdit")
self.menuHelp = QtWidgets.QMenu(self.menubar)
self.menuHelp.setObjectName("menuHelp")
Healthcare.setMenuBar(self.menubar)
self.statusbar = QtWidgets.QStatusBar(Healthcare)
self.statusbar.setObjectName("statusbar")
Healthcare.setStatusBar(self.statusbar)
self.actionImport = QtWidgets.QAction(Healthcare)
self.actionImport.setObjectName("actionImport")
self.actionOpen = QtWidgets.QAction(Healthcare)
self.actionOpen.setObjectName("actionOpen")
self.actionSave = QtWidgets.QAction(Healthcare)
self.actionSave.setObjectName("actionSave")
self.menuFile.addAction(self.actionImport)
self.menuFile.addAction(self.actionOpen)
self.menuFile.addAction(self.actionSave)
self.menubar.addAction(self.menuFile.menuAction())
self.menubar.addAction(self.menuEdit.menuAction())
self.menubar.addAction(self.menuHelp.menuAction())
self.retranslateUi(Healthcare)
QtCore.QMetaObject.connectSlotsByName(Healthcare)
path = self.actionImport.triggered.connect(self.browsefiles)
def retranslateUi(self, Healthcare):
_translate = QtCore.QCoreApplication.translate
Healthcare.setWindowTitle(_translate("Healthcare", "MainWindow"))
self.All_Gen.setText(_translate("Healthcare", "All"))
self.Male.setText(_translate("Healthcare", "Male"))
self.Female.setText(_translate("Healthcare", "Female"))
self.Undefined.setText(_translate("Healthcare", "Undefined "))
self.groupBox.setTitle(_translate("Healthcare", "Demographics"))
self.groupBox_2.setTitle(_translate("Healthcare", "Age"))
self.label.setText(_translate("Healthcare", "To"))
self.label_3.setText(_translate("Healthcare", "To"))
self.TimeSeries.setText(_translate("Healthcare", "Time Series"))
self.KDE.setText(_translate("Healthcare", "Kernel Density"))
self.Histograms.setText(_translate("Healthcare", "Histograms"))
self.Anomalies.setText(_translate("Healthcare", "Anomalies"))
self.AllPatients.setText(_translate("Healthcare", "All patients"))
self.menuFile.setTitle(_translate("Healthcare", "File"))
self.menuEdit.setTitle(_translate("Healthcare", "Edit"))
self.menuHelp.setTitle(_translate("Healthcare", "Help"))
self.actionImport.setText(_translate("Healthcare", "Import"))
self.actionImport.setStatusTip(_translate("Healthcare", "Import Dataset"))
self.actionOpen.setText(_translate("Healthcare", "Open"))
self.actionSave.setText(_translate("Healthcare", "Save"))
def browsefiles(self):
path=QFileDialog.getOpenFileName(None, 'Open file', os.getenv('HOME'), "CSV(*.csv)")
print(path[0])
self.df = pd.read_csv(path[0], index_col = "Date")
def KDEplot(self):
self.figure.clear()
lahore = gpd.read_file(r"C:\Users\drfak\Toolkit\Lahore towns uc and vill\LH_TOWNS-2006_GEO_AREAS.shp")
dataset = pd.read_csv("ABCD.csv")
dataset = gpd.GeoDataFrame(dataset, geometry=gpd.points_from_xy(dataset.Longitude, dataset.Latitude))
gplt.kdeplot(dataset, cmap='Reds', fill = True, clip=lahore)
gplt.polyplot(lahore , ax=ax, zorder =1)
self.canvas.draw()
if __name__ == "__main__":
import sys
app = QtWidgets.QApplication(sys.argv)
Healthcare = QtWidgets.QMainWindow()
ui = Ui_Healthcare()
ui.setupUi(Healthcare)
Healthcare.show()
sys.exit(app.exec_())