0

I'm trying to plot matplotlib plots in pyqt5 windows with navigation toolbar in order to show the next image on click using Figure Canvas. However the code is giving "image cannot converted to float" error on axes.plot. The data is coming from the csv which is then plotted using matplotlib.

# -*- coding: utf-8 -*-

from PyQt5 import QtCore, QtGui, QtWidgets
import matplotlib.pyplot as plt
import pandas as pd
from wordcloud import WordCloud
from matplotlib.backends.backend_qt5agg import FigureCanvas 
from matplotlib.backends.backend_qt4agg import NavigationToolbar2QT as NavigationToolbar

df=pd.read_csv('Trump.csv')

class Ui_MainWindow(object):
  def setupUi(self, MainWindow):
    MainWindow.setObjectName("MainWindow")
    MainWindow.resize(640, 480)
    self.centralwidget = QtWidgets.QWidget(MainWindow)
    self.centralwidget.setObjectName("centralwidget")


    self.figure = plt.figure()
    self.axes = self.figure.add_subplot(111)
    # We want the axes cleared every time plot() is called
    #self.axes.hold(False)
    self.axes.clear()
    self.canvas = FigureCanvas(self.figure)

    self.canvas.setParent(self)

    self.canvas.move(100,20)
    self.canvas.hide()
    self.toolbar = NavigationToolbar(self.canvas, self)
    self.toolbar.hide()


    MainWindow.setCentralWidget(self.centralwidget)
    self.menubar = QtWidgets.QMenuBar(MainWindow)
    self.menubar.setGeometry(QtCore.QRect(0, 0, 640, 21))
    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)

  def retranslateUi(self, MainWindow):
    _translate = QtCore.QCoreApplication.translate
    MainWindow.setWindowTitle(_translate("MainWindow", "MainWindow"))


class MainWindow(QtWidgets.QMainWindow, Ui_MainWindow):
  def __init__(self, parent=None):
    super().__init__(parent)
    self.setupUi(self)
    self.show()

 def show(self):
    wordcloud = WordCloud(random_state=21, max_font_size=110).generate(str(df['Tweets']))
    plot2= plt.imshow(wordcloud, interpolation="bilinear")        
    self.canvas.show()
    self.axes.imshow(plot2)
    self.canvas.draw()

    self.setScene(scene)

    plot3=sns.countplot(x = 'Vader', data = df)
    self.canvas.show()
    self.axes.imshow(plot3)
    self.canvas.draw()

    self.setScene(scene)

    #self.graphicsView.addItem((plt.imshow(wordcloud)))


if __name__ == "__main__":
   import sys
   app = QtWidgets.QApplication(sys.argv)
   w = MainWindow()
   w.show()
   sys.exit(app.exec_())

Any help will be highly appreciated!

2

1 Answer 1

1

When you use matplotlib with Qt you don't have to use pyplot but the axes.

import os
import sys

from PyQt5 import QtCore, QtWidgets

from matplotlib.backends.backend_qt5agg import FigureCanvas, NavigationToolbar2QT
from matplotlib.figure import Figure

from wordcloud import WordCloud
import pandas as pd


class MainWindow(QtWidgets.QMainWindow):
    def __init__(self, parent=None):
        super().__init__(parent)

        self.canvas = FigureCanvas(Figure(figsize=(5, 3)))
        self.toolbar = NavigationToolbar2QT(self.canvas, self)
        self.setCentralWidget(self.canvas)
        self.addToolBar(self.toolbar)
        self.axes = self.canvas.figure.add_subplot()

        current_dir = os.path.dirname(os.path.realpath(__file__))
        df = pd.read_csv(os.path.join(current_dir, "Trump.csv"))
        wordcloud = WordCloud(random_state=21, max_font_size=110).generate(
            str(df["Tweets"])
        )
        self.axes.imshow(wordcloud)

        self.resize(640, 480)


if __name__ == "__main__":
    app = QtWidgets.QApplication(sys.argv)
    w = MainWindow()
    w.show()
    sys.exit(app.exec_())

enter image description here

Sign up to request clarification or add additional context in comments.

1 Comment

Thanks! How can I plot two graphs and swipe them from the navigation toolbar?

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.