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
ax.grid(color='w', linestyle='-', linewidth=2)
Image avec quadrillage au mauvais endroit:
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)
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)
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')
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?