PyQt5控件matplotlib

1. 文章内容会在以后持续增加 

2. 文中涉及的数据,会在文末提供下载链接

1. 双Y轴

1.1 最终效果

1.2 代码

import matplotlib
matplotlib.use("Qt5Agg")
from matplotlib.backends.backend_qt5agg import FigureCanvasQTAgg as FigureCanvas
from matplotlib.figure import Figure
import matplotlib.pyplot as plt
from PyQt5 import QtWidgets
import pandas as pd
import sys
基础类:MplCanvas
class MplCanvas(FigureCanvas):
    """FigureCanvas的最终的父类其实是QWidget。"""

    def __init__(self, parent=None, width=5, height=4, dpi=100):

        # 配置中文显示
        plt.rcParams['font.family'] = ['SimHei']  # 用来正常显示中文标签
        plt.rcParams['axes.unicode_minus'] = False  # 用来正常显示负号

        self.fig = Figure(figsize=(width, height), dpi=dpi)  # 新建一个figure
        # self.axes = self.fig.add_subplot(111)  # 建立一个子图,如果要建立复合图,可以在这里修改

        # self.axes.hold(False)  # 每次绘图的时候不保留上一次绘图的结果

        FigureCanvas.__init__(self, self.fig)
        self.setParent(parent)

        '''定义FigureCanvas的尺寸策略,这部分的意思是设置FigureCanvas,使之尽可能的向外填充空间。'''
        FigureCanvas.setSizePolicy(self,
                                   QtWidgets.QSizePolicy.Expanding,
                                   QtWidgets.QSizePolicy.Expanding)
        FigureCanvas.updateGeometry(self)

    '''绘制静态图,可以在这里定义自己的绘图逻辑'''
    pass
基础类:MplLineOneOrTwoYWidget
class MplLineOneOrTwoYWidget(MplCanvas):
    def __init__(self, *args, **kwargs):
        MplCanvas.__init__(self, *args, **kwargs)
    
    def init_start(self):
        self.axes = self.fig.add_subplot(111)
        self.axes2 = None

    def drawLine(self, data: Dict[str, Any]):
        # 清空画布
        self.fig.clf()
        self.init_start()
        # x轴数据
        x = data['x']
        x_int = []
        x_str = []
        # 坐标只显示10个
        if len(x)>10:
            for i in range(0,len(x),math.floor(len(x)/10)):
                x_int.append(i)
                x_str.append(x[i])
                pass
        else:
            for i in range(0,len(x)):
                x_int.append(i)
                x_str.append(x[i])
        # y轴数据
        y = data['y1']
        # 图形标题
        title_str = data['title_str']
        # x轴标签 str
        xlabel = data['xlabel']
        # y轴标签 str
        ylabel = data['ylabel']
        legend = data['legend']
        self.axes.plot(x, y, color='steelblue',label=legend)
        self.axes.set_xticks(x_int)
        self.axes.set_xticklabels(x_str, rotation=15, fontdict={'size': 8})
        self.axes.set_xlabel(xlabel)
        self.axes.set_ylabel(ylabel)
        self.axes.legend()
        self.fig.suptitle(title_str)
        self.draw()
        self.flush_events()
        pass

    def drawLineTwoY(self,data:Dict[str,Any]):
        # 清空画布
        self.fig.clf()
        self.init_start()
        # x轴数据
        x = data['x']
        x_int = []
        x_str = []
        # 坐标只显示10个
        if len(x)>10:
            for i in range(0, len(x), math.floor(len(x) / 10)):
                x_int.append(i)
                x_str.append(x[i])
                pass
        else:
            for i in range(0,len(x)):
                x_int.append(i)
                x_str.append(x[i])
        # y轴数据
        y1 = data['y1']
        y2 = data['y2']
        # 图形标题
        title_str = data['title_str']
        # x轴标签 str
        xlabel = data['xlabel']
        # y轴标签 str
        ylabel = data['ylabel']
        ylabel2 = data['ylabel2']
        legend1 = data['legend1']
        legend2 = data['legend2']
        self.axes2 = self.axes.twinx()
        self.axes.plot(x, y1, color='steelblue',label=legend1)
        self.axes2.plot(x,y2,color='orange',label=legend2)
        self.axes.set_xticks(x_int)
        self.axes.set_xticklabels(x_str, rotation=15, fontdict={'size': 8})
        self.axes.set_xlabel(xlabel)
        self.axes.set_ylabel(ylabel)
        self.axes2.set_ylabel(ylabel2)
        self.axes.legend(loc=2)
        self.axes2.legend(loc=1)
        self.fig.suptitle(title_str)
        self.draw()
        self.flush_events()
        pass
    pass

实际使用类:MatplotlibExample

class MatplotlibExample(QtWidgets.QWidget):
    def __init__(self):
        super().__init__()
        self.init_data()
        self.init_ui()

    def init_data(self):
        file_path = r'./002410_pe.csv'
        df = pd.read_csv(file_path, encoding='utf-8')
        df00 = df.loc[:, ['tradeDate', 'closePrice', 'pe', 'close_log', 'pe_log']]

        self.show_dict = {}
        self.show_dict['x'] = df00['tradeDate'].values.tolist()
        self.show_dict['y1'] = df00['closePrice'].values.tolist()
        self.show_dict['y2'] = df00['close_log'].values.tolist()
        self.show_dict['xlabel'] = '日期'
        self.show_dict['ylabel'] = '收盘价'
        self.show_dict['ylabel2'] = '对数收盘价'
        self.show_dict['legend1'] = '收盘价'
        self.show_dict['legend2'] = '对数收盘价'
        self.show_dict['title_str'] = '双Y轴例子'
        pass

    def init_ui(self):
        self.setWindowTitle('Matplotlib例子')
        self.setMinimumWidth(1000)
        self.setMinimumHeight(600)

        self.show_widget = MplLineOneOrTwoYWidget()
        self.show_widget.drawLineTwoY(self.show_dict)

        layout = QtWidgets.QVBoxLayout()
        layout.addWidget(self.show_widget)
        self.setLayout(layout)
        pass


if __name__ == '__main__':
    app = QtWidgets.QApplication(sys.argv)
    temp_w = MatplotlibExample()
    temp_w.show()
    sys.exit(app.exec_())
    pass

PS:

链接:https://pan.baidu.com/s/1PY44Xu3YAh11ZZGKDBWSjQ 
提取码:urlg

  • 0
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值