Je veux obtenir une figure matplotlib sous forme de tableau RGBA en 3 dimensions. J'utilise le code suivant pour effectuer la conversion:

%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

Pourquoi le rapport hauteur / largeur change-t-il par rapport au tableau carré d'origine? Y a-t-il un paramètre que je peux spécifier ou une méthode alternative pour obtenir le tableau rgba de la figure dans sa forme d'origine?

0
prl900 8 mars 2016 à 09:42

3 réponses

Meilleure réponse

J'ai trouvé une méthode alternative qui n'utilise pas la fonction .imshow () et qui préserve le rapport de taille:

%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

0
prl900 11 mars 2016 à 05:20

Lorsque j'exécute votre code dans pycharm (353, 497) lorsque j'exécute votre code dans pycharm ligne par ligne (353, 353) lorsque j'exécute votre code dans ipython (à partir du shell de commande) (385, 497)

Je suppose que

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

Make_image () ne transforme en fait pas les valeurs, MAIS une valeur pour chaque pixel des axes. Donc, si vos axes sont affichés sous forme de carré à l'écran, il sélectionne un carré à une résolution plus élevée. Sinon, juste un rectangle, selon votre backend et la résolution de l'écran.

0
cattt84 8 mars 2016 à 10:42

Je pense que vous pouvez y arriver en utilisant cette réponse: https://stackoverflow.com/a/35362787/1072212, mais à la place des canvas.tostring_rgb() utilisent canvas.tostring_argb() (pas ..._rgba()), et

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

Plus tard, vous voudrez peut-être

img = Image.fromarray(image, 'RGBA')
img.save('my.png')
img.show()
0
Terry Brown 22 mai 2017 à 17:09