Wizualizacja danych siatki 2D w Pythonie
Muszę zwizualizować pewne dane. Jest to podstawowa siatka 2D, gdzie każda komórka ma wartość float. Wiem jak np. przypisać kolor do wartości i paint grid w OpenCV. Ale chodzi o to, że jest tak wiele wartości, więc jest prawie niemożliwe, aby to zrobić. Szukam jakiejś metody, w której mógłbym użyć gradientu. Na przykład wartość -5.0 będzie reprezentowana przez niebieski, 0-czarny, a +5.0 jako czerwony. Czy Można to zrobić w Pythonie?
Oto przykładowe dane, o których mówię
A B C D
A -1.045 2.0 3.5 -4.890
B -5.678 3.2 2.89 5.78
2 answers
Matplotlib posiada metodę imshow
do tworzenia tablic:
from matplotlib import mpl,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()
Tak to wygląda:
Szczegóły konfiguracji paska kolorów zostały zaczerpnięte z przykładu matplotlib: colorbar_only.py. wyjaśnia, że liczba boundaries
musi być większa niż liczba kolorów.
EDIT
Powinieneś zauważyć , że imshow
akceptuje słowo kluczowe origin
, które ustawia gdzie pierwszy punkt jest przydzielony. Domyślnym ustawieniem jest 'górny lewy', dlatego w moim wykresie oś y mA 0 w lewym górnym rogu i 99 (Nie pokazane) w lewym dolnym rogu. Alternatywą jest ustawienie origin="lower"
, tak aby pierwszy punkt był wykreślony w lewym dolnym rogu.
EDIT 2
Jeśli chcesz gradient, a nie dyskretną mapę kolorów, stwórz mapę kolorów poprzez interpolację liniową poprzez szereg kolorów:
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")
To daje:
Edytuj 3
Aby dodać siatkę, jak pokazano w tym przykładzie , użyj metody grid
. Ustawienie koloru siatki na "biały" działa dobrze z kolorami używanymi przez colormap (tzn. domyślna czerń nie wyświetla się dobrze).
pyplot.grid(True,color='white')
Włączenie tego przed wywołaniem savefig
tworzy ten wykres (wykonany przy użyciu siatki 11x11 dla jasności):
Istnieje wiele opcji grid
, które są opisane w dokumentacji matplotlib . Jednym, który może Cię zainteresować, jest linewidth
.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-08-29 15:25:51
Jak o użyciu 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()
To pokazuje:
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-08-29 13:17:38