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
相关产品推荐
相关产品推荐

