PyQt5 Matplotlib всплывающая аннотация с линией сетки - PullRequest
0 голосов
/ 04 мая 2020

enter image description here

Я пытаюсь показать данные о цене акций в tableWidget вместе с графиком Matplotlib. я создал mainWindow в qtDesigner с tableWidget и другим виджетом, повышенным до MplWidget, и создал класс MplWidget для холста matplotlib. и я использовал Pandas для данных. работает нормально. теперь я хочу сделать ...

  1. пока я запускаю мою программу, холст matplotlib уже появляется (без данных), который я не хочу показывать. Он будет пустым.

  2. при наведении указателя мыши с данными (дата, цена) с линией сетки (горизонтальной и вертикальной). Линия сетки будет появляться только при наведении курсора мыши на график (как показано на рисунке). я использовал 'mplcursor', но не получил, который я точно искал

  3. Все даты показаны по оси X, я не могу установить частоту дат. я попытался с 'xticks', но, возможно, я делаю это неправильно.

mainWindow.py

from PyQt5 import QtCore, QtGui, QtWidgets
from PyQt5.QtWidgets import QApplication,QWidget,QPushButton,QMenu
from design import Ui_MainWindow
from eventHandler import *
import datetime
from mplwidget import MplWidget
import numpy as np
import matplotlib
matplotlib.use('Qt5Agg')
import matplotlib.pyplot as plt
import matplotlib.ticker as ticker
from matplotlib.backends.backend_qt5agg import FigureCanvas 
from matplotlib.backends.backend_qt5agg import NavigationToolbar2QT as NavigationToolbar
from matplotlib.backends.backend_qt5agg import FigureCanvasQTAgg
from matplotlib.figure import Figure
import random
import pandas as pd
import numpy as np
import pandas.io.sql as psql
import pyodbc
import mplcursors


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

    def securitycall(self):

        # function call from eventHandler and data retrive from MSSQL SERVER 
        # show data in tableWidget 
        # variable df is the price dataset using pandas 

        df=pd.read_sql(sql,conn)
        print(df["priceDate"])

        t=df["priceDate"]
        p=df["price"]


        self.MplWidget.canvas.axes.clear()

        # background color-------
        # self.MplWidget.canvas.axes.set_facecolor((1.0, 0.47, 0.42))
        # plot color-------------
        self.MplWidget.canvas.axes.plot(t, p,color='deepskyblue', linewidth=0.7)
        # x-labels vertical------------
        self.MplWidget.canvas.axes.set_xticklabels(labels=t, rotation=90)

        self.MplWidget.canvas.axes.tick_params(axis='x', which='major', labelsize=9,color='deepskyblue')
        # canvas border color-------------
        self.MplWidget.canvas.axes.spines['bottom'].set_color('deepskyblue')
        self.MplWidget.canvas.axes.spines['top'].set_color('deepskyblue')
        self.MplWidget.canvas.axes.spines['right'].set_color('deepskyblue')
        self.MplWidget.canvas.axes.spines['left'].set_color('deepskyblue')

        # grid view--------------------
        # self.MplWidget.canvas.axes.grid(True, lw ='.2', ls = '--', c = '.1')

        #labels--------------
        self.MplWidget.canvas.axes.set_xlabel('Date')
        self.MplWidget.canvas.axes.set_ylabel('Prices')

        # Annotate on hover with grid line show------------
        mplcursors.cursor(hover=True)


        self.MplWidget.canvas.axes.legend(('cosinus'),loc='upper right')
        self.MplWidget.canvas.axes.set_title('STOCK PRICES')
        self.MplWidget.canvas.draw()



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

mplWidget.py

from PyQt5.QtWidgets import*
from matplotlib.backends.backend_qt5agg import FigureCanvas
from matplotlib.figure import Figure
class MplWidget(QWidget):
    def __init__(self, parent = None):

        QWidget.__init__(self, parent)
        self.canvas = FigureCanvas(Figure())
        vertical_layout = QVBoxLayout()
        vertical_layout.addWidget(self.canvas)

        self.canvas.axes = self.canvas.figure.add_subplot(111)
        # self.canvas.hide()
        self.setLayout(vertical_layout)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...