创建绘图框的画布

时间:2014-05-31 20:24:13

标签: python canvas matplotlib

我有以下功能:

def get_rgba_bitmap(fig):
  fig.canvas.draw()
  tab = fig.canvas.copy_from_bbox(fig.bbox).to_string_argb()
  ncols, nrows = fig.canvas.get_width_height()
  return numpy.fromstring(tab, dtype = numpy.uint8).reshape(nrows, ncols, 4)

使用此功能,我可以创建图像的“地图”。有关我为何需要“地图”以及产生该功能的答案的详细信息,请参阅link。绘制“地图”给出:

import numpy
import matplotlib.pyplot as plt

random_gen = numpy.random.mtrand.RandomState(seed = 127260)
x_test = random_gen.uniform(-1., 1., size= (10,10))

fig1 = plt.figure()
ax1 = fig1.add_subplot(1, 1, 1)
ax1.imshow(x_test, cmap = "seismic")

bitmap_rgba1 = get_rgba_bitmap(fig1)

fig2 = plt.figure()
ax1 = fig2.add_subplot(1, 1, 1)
ax1.imshow(bitmap_rgba1)

plt.show()

enter image description here

使用get_rgba_bitmap(fig)创建的画布属于整个图形,包括灰色背景。当绘制“地图”时,因此也包括灰色背景,缩小了实际图像的尺寸。在单个图像的情况下,这对我来说无关紧要,因为有办法解决它。但是,我现在需要几个子图,这确实成了一个问题。

因此,我现在需要的是一个只创建绘图框的画布的功能。刻度和标签并不重要。我尝试修改get_rgba_bitmap函数但它没有完全起作用:

def test(fig, ax):
  fig.canvas.draw()
  tab = fig.canvas.copy_from_bbox(ax.bbox).to_string_argb()

  bbox = ax.get_window_extent().transformed(fig.dpi_scale_trans.inverted())
  width, height = bbox.width * fig.dpi, bbox.height * fig.dpi

  ncols, nrows = width, height
  return numpy.fromstring(tab, dtype = numpy.uint8).reshape(nrows + 1, ncols + 1, 4)

我认为问题在于ncolsnrows的错误值。不确定它来自何处。

如果我在ncols中向nrowsreshape添加1,则脚本会运行并生成接近我想要的图像。但是,“地图”在新的绘图框架中无法正确显示,从它的外观来看,它在xy中偏离了1个像素。这相当于我需要添加到nrowsncols的1。我该如何解决这个问题?

enter image description here

感谢您的帮助

0 个答案:

没有答案