自定义matplotlib图形

3 投票
2 回答
3010 浏览
提问于 2025-04-17 15:05

我正在使用matplotlib.pyplot来开发一个小模块(代码附在后面)。但是,我不知道怎么自定义图形(比如增加图形大小,改变背景颜色)。我该怎么做呢?我尝试在 self.fig, self.ax = plt.subplots() 之后使用 fig = plt.figure(figsize=(16,8)),这样确实增加了图形的大小并添加了我的按钮,但却把我的图表放在了一个单独的图形上。我简单的错误是什么呢?

enter image description here

    # Setup the axes.
    self.fig, self.ax = plt.subplots()
    self.slider_ax    = self.fig.add_axes([0.2, 0.03, 0.65, 0.03])
    self.delete_ax    = self.fig.add_axes([0.85, 0.84, 0.1, 0.04])
    self.register_ax  = self.fig.add_axes([0.85, 0.78, 0.1, 0.04])
    self.add_ax       = self.fig.add_axes([0.85, 0.72, 0.1, 0.04])
    self.save_ax      = self.fig.add_axes([0.85, 0.66, 0.1, 0.04])
    self.reset_ax     = self.fig.add_axes([0.85, 0.16, 0.1, 0.04])
    self.quit_ax      = self.fig.add_axes([0.85, 0.1,  0.1, 0.04])

    # Make the slider
   ! self.slider = Slider(self.slider_ax, 'Frame', 0, 1, 
                        valinit=0, valfmt='%1.2f', closedmin=True,
                        closedmax=False)
    self.slider.on_changed(self.update)

    #Make the buttons
    self.del_button = Button(self.delete_ax, 'Delete')
    self.del_button.on_clicked(self.delete)
    self.reg_button = Button(self.register_ax, 'Register')
    self.reg_button.on_clicked(self.register)
    self.add_button = Button(self.add_ax, "Add")
    self.add_button.on_clicked(self.add)
    self.save_button = Button(self.save_ax, "Save")
    self.save_button.on_clicked(self.save)
    self.quit_button = Button(self.quit_ax, "Quit")
    self.quit_button.on_clicked(self.quit)
    self.reset_button = Button(self.reset_ax, "Reset")
    self.reset_button.on_clicked(self.reset)


    # Plot the first slice of the image
    self.im = self.ax.imshow(np.array(raw_dicom_stack[0]), cmap = cm.gray)

2 个回答

2

每次调用 plt.figure 时,都会创建一个新的图形实例。如果你想修改已经存在的图形,可以使用图形实例上提供的方法。与这个问题直接相关的两个方法是 set_figwidth(设置图形的宽度)、set_figheight(设置图形的高度)和 set_facecolor(设置图形的背景颜色)。

希望这对你有帮助!

4

plt.subplots 有一个叫 **fig_kw 的参数,它包含了所有可以传给图形的关键词参数(具体可以查看图形文档)。其中一个参数是 figsize,你可以这样做:

self.fig, self.ax = plt.subplots(figsize=(16,8), ...)

另外,你可以在图形创建后使用图形的方法。

self.fig.set_size_inches(16,8, forward=True)

如果你在调用 subplots 之后再调用 self.fig = plt.figure(),那么会正确地显示第二个图形。而当你把所有按钮添加到 self.fig 时,它们都会添加到最后定义的那个图形上。

最后:可能更好的是用 add_axes 来创建 self.ax,这样可以和其他坐标轴保持一致,并且能更好地控制它的位置。

编辑 (详细解释最后一句话)

self.ax 是一个 matplotlib.axes.AxesSubplot 对象(就像你用 plt.subplot(111) 得到的那样),而所有按钮都是添加到 matplotlib.axes.Axes 对象上的(这些对象是用 add_axes 创建的)。

把坐标轴和子图放在一起可能会导致图形和按钮、滑块之间的位置关系出现问题,尤其是在改变图形大小或调整窗口大小时。

我认为在图形画布中一致地划分空间,使用 axessubplots,会更好地避免这些潜在问题。因此,我建议要么用 self.ax = fig.add_axes(...) 来创建绘图坐标轴,要么使用类似 gridspec 的工具。

撰写回答