You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

PyQt5结合Matplotlib绘图时如何使用yticks?

在PyQt5中结合Matplotlib时自定义Y轴刻度的解决方法

你遇到的这个情况其实挺典型的:用纯Matplotlib的时候,plt.yticks()能轻松自定义Y轴刻度,但一结合PyQt5的Canvas就失效了对吧?这是因为在PyQt集成Matplotlib的场景下,我们不能再依赖plt这个全局绘图上下文的函数了,得直接操作我们创建的Figure对应的Axes对象才行。

问题根源

plt.yticks()是针对pyplot模块维护的全局Figure和Axes来操作的,但在PyQt里,我们是自己实例化了self.figure = plt.figure(),这个Figure和pyplot的全局上下文是分开的,所以调用plt.yticks()根本不会作用到我们在Canvas上显示的那个图上。

解决方法

我们需要先获取当前Figure对应的Axes对象,然后用Axes的set_yticks()和set_yticklabels()方法来设置刻度,而不是用plt的全局函数。下面是修改后的完整代码示例:

from PyQt5.QtWidgets import QDialog, QVBoxLayout, QPushButton
from matplotlib.backends.backend_qt5agg import FigureCanvasQTAgg as FigureCanvas
import matplotlib.pyplot as plt
import numpy as np

class Window(QDialog):
    def __init__(self, parent=None):
        super(Window, self).__init__(parent)
        # 初始化Figure和Canvas
        self.figure = plt.figure()
        self.canvas = FigureCanvas(self.figure)
        
        # 添加一个按钮用来触发绘图(示例用)
        self.btn_plot = QPushButton("绘制图表")
        self.btn_plot.clicked.connect(self.plot)
        
        # 布局设置
        layout = QVBoxLayout()
        layout.addWidget(self.canvas)
        layout.addWidget(self.btn_plot)
        self.setLayout(layout)

    def plot(self):
        # 生成测试数据
        data = np.random.randint(1, 6, size=10)
        
        # 清空当前Figure,避免重复绘图
        self.figure.clear()
        # 获取当前Figure的Axes对象(如果没有就创建一个)
        ax = self.figure.add_subplot(111)
        
        # 绘制图表
        ax.plot(data, 'ro')
        
        # 自定义Y轴刻度——这里用Axes的方法来设置
        ax.set_yticks([1, 2, 3, 4, 5])
        ax.set_yticklabels(['Fault 1', 'Fault 2', 'Fault 3', 'Fault 4', 'Fault 5'])
        
        # 更新Canvas显示
        self.canvas.draw()

# 测试运行
if __name__ == '__main__':
    import sys
    from PyQt5.QtWidgets import QApplication
    app = QApplication(sys.argv)
    window = Window()
    window.show()
    sys.exit(app.exec_())

关键要点

  • 不要使用plt的全局函数(比如plt.yticks()、plt.plot()),而是操作具体的Axes实例(上面代码里的ax对象)
  • 每次绘图前记得清空Figure(self.figure.clear()),避免多次绘图叠加
  • 设置完刻度后一定要调用self.canvas.draw()来更新Canvas的显示

内容的提问来源于stack exchange,提问作者rosefun

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.27 03:33:06