web-dev-qa-db-fra.com

Ajustement des quadrillages et des graduations dans matplotlib imshow

J'essaie de tracer une matrice de valeurs et je voudrais ajouter un quadrillage pour rendre la frontière entre les valeurs plus claire. Malheureusement, imshow a décidé de localiser les graduations au milieu de chaque Voxel. est-ce possible de

a) retirer les tiques mais laisser l'étiquette au même endroit et
b) ajouter un quadrillage entre les limites des pixels?

import matplotlib.pyplot as plt
import numpy as np

im = plt.imshow(np.reshape(np.random.Rand(100), newshape=(10,10)),
                    interpolation='none', vmin=0, vmax=1, aspect='equal');
ax = plt.gca();
ax.set_xticks(np.arange(0, 10, 1));
ax.set_yticks(np.arange(0, 10, 1));
ax.set_xticklabels(np.arange(1, 11, 1));
ax.set_yticklabels(np.arange(1, 11, 1));

Image sans quadrillage et avec des graduations au mauvais endroit enter image description here

ax.grid(color='w', linestyle='-', linewidth=2)

Image avec quadrillage au mauvais endroit:

enter image description here

23
Joe Bathelt

Essayez de déplacer les tiques des axes:

ax = plt.gca()
ax.set_xticks(np.arange(-.5, 10, 1))
ax.set_yticks(np.arange(-.5, 10, 1))
ax.set_xticklabels(np.arange(1, 12, 1))
ax.set_yticklabels(np.arange(1, 12, 1))

enter image description here

18
Serenity

Code de solution tel que suggéré par Serenity:

plt.figure()
im = plt.imshow(np.reshape(np.random.Rand(100), newshape=(10,10)),
                interpolation='none', vmin=0, vmax=1, aspect='equal');

ax = plt.gca();

# Major ticks
ax.set_xticks(np.arange(0, 10, 1));
ax.set_yticks(np.arange(0, 10, 1));

# Labels for major ticks
ax.set_xticklabels(np.arange(1, 11, 1));
ax.set_yticklabels(np.arange(1, 11, 1));

# Minor ticks
ax.set_xticks(np.arange(-.5, 10, 1), minor=True);
ax.set_yticks(np.arange(-.5, 10, 1), minor=True);

# Gridlines based on minor ticks
ax.grid(which='minor', color='w', linestyle='-', linewidth=2)

Image résultante: enter image description here

37
Joe Bathelt

Vous pouvez déplacer les pixels en passant l'argument extent à imshow. extent est une liste de scalaires à 4 éléments (gauche, droite, bas, haut):

foo = np.random.Rand(35).reshape(5, 7)
# This keeps the default orientation (Origin at top left):
extent = (0, foo.shape[1], foo.shape[0], 0)
_, ax = plt.subplots()
ax.imshow(foo, extent=extent)
ax.grid(color='w', linewidth=2)
ax.set_frame_on(False)

enter image description here

3
drammock

On peut trouver plus facile à utiliser plt.pcolor ou plt.pcolormesh :

data = np.random.Rand(10, 10)
plt.pcolormesh(data, edgecolors='k', linewidth=2)
ax = plt.gca()
ax.set_aspect('equal')

enter image description here

Cependant, il existe certaines différences entre eux et plt.imshow, La plus évidente étant que l'image est permutée par l'axe Y (vous pouvez facilement l'inverser en ajoutant ax.invert_yaxis() cependant). Pour plus de détails, voir ici: Quand utiliser imshow sur pcolormesh?

2
Georgy