我有以下功能:
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()
使用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)
我认为问题在于ncols
和nrows
的错误值。不确定它来自何处。
如果我在ncols
中向nrows
和reshape
添加1,则脚本会运行并生成接近我想要的图像。但是,“地图”在新的绘图框架中无法正确显示,从它的外观来看,它在x
和y
中偏离了1个像素。这相当于我需要添加到nrows
和ncols
的1。我该如何解决这个问题?
感谢您的帮助