J'ai besoin de visualiser certaines données. C'est une grille 2D de base, où chaque cellule a une valeur flottante. Je sais par exemple attribuer une couleur à la valeur et à la grille de peinture dans OpenCV. Mais le fait est qu'il y a tellement de valeurs qu'il est donc presque impossible de le faire. Je cherche une méthode, où je pourrais utiliser le gradient. Par exemple, la valeur -5,0 sera représentée en bleu, 0 - noir et +5,0 en rouge. Existe-t-il un moyen de le faire en Python?
Voici des exemples de données dont je parle
A B C D
A -1.045 2.0 3.5 -4.890
B -5.678 3.2 2.89 5.78
Matplotlib a la méthode imshow
pour tracer les tableaux:
import matplotlib as mpl
from matplotlib import pyplot
import numpy as np
# make values from -5 to 5, for this example
zvals = np.random.Rand(100,100)*10-5
# make a color map of fixed colors
cmap = mpl.colors.ListedColormap(['blue','black','red'])
bounds=[-6,-2,2,6]
norm = mpl.colors.BoundaryNorm(bounds, cmap.N)
# tell imshow about color map so that only set colors are used
img = pyplot.imshow(zvals,interpolation='nearest',
cmap = cmap,norm=norm)
# make a color bar
pyplot.colorbar(img,cmap=cmap,
norm=norm,boundaries=bounds,ticks=[-5,0,5])
pyplot.show()
Voici à quoi ça ressemble:
Les détails de la configuration de la barre de couleur sont tirés d'un exemple de matplotlib: colorbar_only.py. Il explique que le nombre de boundaries
doit être plus grand que le nombre de couleurs.
[~ # ~] modifier [~ # ~]
Vous devez note , que imshow
accepte le mot clé Origin
, qui définit où le premier point est affecté. La valeur par défaut est "en haut à gauche", c'est pourquoi dans mon graphique publié, l'axe y a 0 en haut à gauche et 99 (non illustré) en bas à gauche. L'alternative consiste à définir Origin="lower"
, de sorte que le premier point soit tracé dans le coin inférieur gauche.
EDIT 2
Si vous voulez un dégradé et non une carte de couleurs discrète, créez une carte de couleurs en interpolant linéairement à travers une série de couleurs:
fig = pyplot.figure(2)
cmap2 = mpl.colors.LinearSegmentedColormap.from_list('my_colormap',
['blue','black','red'],
256)
img2 = pyplot.imshow(zvals,interpolation='nearest',
cmap = cmap2,
Origin='lower')
pyplot.colorbar(img2,cmap=cmap2)
fig.savefig("image2.png")
Cela produit:
EDIT 3
Pour ajouter une grille, comme indiqué dans cet exemple , utilisez la méthode grid
. La définition de la couleur de la grille sur "blanc" fonctionne bien avec les couleurs utilisées par la palette de couleurs (c'est-à-dire que le noir par défaut ne s'affiche pas bien).
pyplot.grid(True,color='white')
L'inclusion de ceci avant l'appel savefig
produit ce tracé (réalisé à l'aide d'une grille 11x11 pour plus de clarté): Il existe de nombreuses options pour grid
, qui sont décrites dans matplotlib documentation . Celui qui pourrait vous intéresser est linewidth
.
Que diriez-vous d'utiliser matplotlib?
from mpl_toolkits.mplot3d import Axes3D
from matplotlib import cm
from matplotlib.ticker import LinearLocator, FixedLocator, FormatStrFormatter
import matplotlib.pyplot as plt
import numpy as np
fig = plt.figure()
ax = Axes3D(fig)
Z = np.array([[-1.045, 2.0, 3.5, -4.890],
[-5.678, 3.2, 2.89, 5.78]])
X = np.zeros_like(Z)
X[1,:] = 1
Y = np.zeros_like(Z)
Y[:,1] = 1
Y[:,2] = 2
Y[:,3] = 3
surf = ax.plot_surface(X, Y, Z, rstride=1, cstride=1, cmap=cm.jet,
linewidth=0, antialiased=False)
ax.set_zlim3d(-10.0, 10.0)
ax.w_zaxis.set_major_locator(LinearLocator(10))
ax.w_zaxis.set_major_formatter(FormatStrFormatter('%.03f'))
m = cm.ScalarMappable(cmap=cm.jet)
m.set_array(Z)
fig.colorbar(m)
plt.show()
Ceci montre: