自定义matplotlib图形
我正在使用matplotlib.pyplot来开发一个小模块(代码附在后面)。但是,我不知道怎么自定义图形(比如增加图形大小,改变背景颜色)。我该怎么做呢?我尝试在 self.fig, self.ax = plt.subplots()
之后使用 fig = plt.figure(figsize=(16,8))
,这样确实增加了图形的大小并添加了我的按钮,但却把我的图表放在了一个单独的图形上。我简单的错误是什么呢?
# 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 个回答
每次调用 plt.figure
时,都会创建一个新的图形实例。如果你想修改已经存在的图形,可以使用图形实例上提供的方法。与这个问题直接相关的两个方法是 set_figwidth(设置图形的宽度)、set_figheight(设置图形的高度)和 set_facecolor(设置图形的背景颜色)。
希望这对你有帮助!
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
创建的)。
把坐标轴和子图放在一起可能会导致图形和按钮、滑块之间的位置关系出现问题,尤其是在改变图形大小或调整窗口大小时。
我认为在图形画布中一致地划分空间,使用 axes
或 subplots
,会更好地避免这些潜在问题。因此,我建议要么用 self.ax = fig.add_axes(...)
来创建绘图坐标轴,要么使用类似 gridspec 的工具。