python matplotlib图成rgba数组

时间:2016-03-08 06:42:52

标签: python arrays matplotlib

我想将matplotlib图作为3维RGBA数组。我使用以下代码进行转换:

%matplotlib inline

import matplotlib.pyplot as plt
import numpy as np

canvas = np.zeros((20, 20))

img = plt.imshow(canvas, interpolation='none').make_image()
h, w, d = img.as_rgba_str()
print(h,w)
rgba_array = np.fromstring(d, dtype=np.uint8).reshape(h, w, 4)

plt.imshow(rgba_array)

Out[1]: (249, 373)
<matplotlib.image.AxesImage at 0x111fa8b10>

output from cell

为什么宽高比会从原始方阵变化?是否有我可以指定的参数或另一种方法来使图形的rgba阵列保持其原始形状?

3 个答案:

答案 0 :(得分:0)

当我在pycharm中执行你的代码时 (353,497) 当我逐行在pycharm中执行你的代码时 (353,353) 当我在ipython中执行你的代码时(来自命令shell) (385,497)

我想

img = plt.imshow(canvas, interpolation='none').make_image()
h, w, d = img.as_rgba_str()

make_image()实际上并没有转换值,但是轴中每个像素都有一个值。因此,如果您的轴在屏幕上显示为正方形,则会选择更高分辨率的正方形。否则只是一些矩形,具体取决于你的后端和屏幕分辨率。

答案 1 :(得分:0)

我找到了一种替代方法,它不使用.imshow()函数并保留大小比例:

%matplotlib inline

import matplotlib.pyplot as plt
import numpy as np
from PIL import Image

canvas = np.zeros((20, 20))
img = Image.fromarray(np.uint8(plt.cm.gist_earth(canvas)*255))
rgba_array = np.array(img.getdata(), np.uint8).reshape(img.size[1], img.size[0], 4)
print(rgba_array.shape)

plt.imshow(rgba_array)

Out[1]: (20, 20, 4)
<matplotlib.image.AxesImage at 0x112a71710>

enter image description here

答案 2 :(得分:0)

我认为你可以使用这个答案来实现:https://stackoverflow.com/a/35362787/1072212,而不是canvas.tostring_rgb()使用canvas.tostring_argb()(不是..._rgba())和

width, height = map(int, fig.get_size_inches() * fig.get_dpi())
image = image.reshape(height, width, 4)
image = np.roll(image, -1, 2)

以后你可能想要

img = Image.fromarray(image, 'RGBA')
img.save('my.png')
img.show()