首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >PySide6 GUI 编程(48): 基于Matplotlib绘制函数曲线

PySide6 GUI 编程(48): 基于Matplotlib绘制函数曲线

原创
作者头像
密码学人CipherHUB
修改2024-11-29 20:41:39
修改2024-11-29 20:41:39
1.1K1
举报
文章被收录于专栏:编码视界编码视界

示例代码

代码语言:python
复制
from __future__ import annotations

import sys
from typing import List, Tuple

import matplotlib.pyplot as plt
import numpy as np
from matplotlib.backends.backend_qtagg import FigureCanvasQTAgg as FigureCanvas
from PySide6.QtWidgets import QApplication, QMainWindow, QVBoxLayout, QWidget


class MatplotlibWidget(QWidget):
    def __init__(self, name: str, points: List[Tuple[float, float]]):
        super().__init__()
        plt.rcParams['font.size'] = 14  # 字体大小
        plt.rcParams['axes.unicode_minus'] = False  # 解决负号 '-' 显示为方块的问题

        # 创建 Matplotlib 图形
        self.figure, self.ax = plt.subplots()
        # FigureCanvas 是 Matplotlib 的一个类
        # 专门用于将 Matplotlib 图形嵌入到 Qt 应用程序中
        # 具体来说,FigureCanvasQTAgg 是一个后端类
        # 它实现了 FigureCanvas,并提供了与 Qt 的集成
        self.canvas = FigureCanvas(self.figure)

        # 设置布局
        layout = QVBoxLayout()
        layout.addWidget(self.canvas)
        self.setLayout(layout)

        # 绘制函数曲线
        self.plot(name, points)

    def plot(self, name: str, points: List[Tuple[float, float]]):
        # 清空之前的图形
        self.ax.clear()

        # 生成 X 值
        x = [i[0] for i in points]
        # 计算 Y 值
        y = [i[1] for i in points]

        # 绘制曲线
        self.ax.plot(x, y, label = name, color = 'red', linewidth = 3)
        self.ax.set_title(name)
        self.ax.set_xlabel('x')
        self.ax.set_ylabel('y')
        self.ax.grid()
        self.ax.legend()

        # 刷新画布
        self.canvas.draw()


class MainWindow(QMainWindow):
    def __init__(self):
        super().__init__()

        self.setWindowTitle("Matplotlib in PySide6")
        x = np.linspace(-10, 10, 1000)

        # 创建 MatplotlibWidget 实例
        self.matplotlib_widget = MatplotlibWidget('sin(x)', [(i, np.sin(i)) for i in x])
        self.setCentralWidget(self.matplotlib_widget)


if __name__ == "__main__":
    app = QApplication(sys.argv)
    main_window = MainWindow()
    main_window.show()
    app.exec()

运行效果

函数曲线
函数曲线

遗留问题

Matplotlib 似乎对中文的支持不太好,如果有中文字符要展示的话可能会乱码?

如果需要展示中文则需要在编码时特殊处理。

--- 2024-11-29 UPDATE ---

matplotlib 中展示中文的办法:

代码语言:python
复制
from __future__ import annotations

import matplotlib
import matplotlib.pyplot as plt
import numpy as np

# 设置支持中文的字体
# font_name = 'Microsoft YaHei'
font_name = 'Kai'
matplotlib.rcParams['font.family'] = font_name
matplotlib.rcParams['font.size'] = 14
matplotlib.rcParams['axes.unicode_minus'] = False  # 正确显示负号

fig, ax = plt.subplots()  # 创建一个figure
x = np.linspace(0, 2, 100)
ax.plot(x, x, label = 'linear 线性')  # 绘制图像
ax.plot(x, x ** 2, label = 'quadratic 平方')
ax.plot(x, x ** 3, label = 'cubic 立方')
ax.set_xlabel('x 坐标轴')
ax.set_ylabel('y 坐标轴')
ax.set_title(f'Plot 示例-字体为 {font_name}')
ax.legend()

plt.show()  # 显示图像

目前在Mac上已经测试过,可以在 matplotlib 中正常展示中文的两种字体为:

Microsoft YaHeiKaiNerdFont系列字体均不行

matplotlib 中展示中文 - 楷体
matplotlib 中展示中文 - 楷体
matplotlib 中展示中文 - 微软雅黑
matplotlib 中展示中文 - 微软雅黑

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 示例代码
  • 运行效果
  • 遗留问题
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档