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
Author: Seanny123, 2011-08-29

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:

Tutaj wpisz opis obrazka

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: Tutaj wpisz opis obrazka

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): Tutaj wpisz opis obrazka Istnieje wiele opcji grid, które są opisane w dokumentacji matplotlib . Jednym, który może Cię zainteresować, jest linewidth.

 42
Author: Yann,
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:

Tutaj wpisz opis obrazka

 8
Author: jterrace,
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