Подтвердить что ты не робот

2D-визуализация сетки в Python

Мне нужно визуализировать некоторые данные. Это базовая 2D-сетка, где каждая ячейка имеет значение float. Я знаю, как, например, назначить цвет значениям и краской сетки в OpenCV. Но дело здесь в том, что существует так много ценностей, поэтому почти невозможно это сделать. Я ищу какой-то метод, где я мог бы использовать градиент. Например, значение -5.0 будет представлено синим, 0 - черным и +5.0 красным. Есть ли способ сделать это в Python?

Вот пример данных, о которых я говорю

        A       B       C        D
A    -1.045    2.0     3.5    -4.890
B    -5.678    3.2     2.89    5.78
4b9b3361

Ответ 1

Matplotlib имеет метод imshow для построения массивов:

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()

Вот как это выглядит:

enter image description here

Детали для настройки цветовой шкалы были взяты из примера matplotlib: colorbar_only.py. Это объясняет, что количество boundaries должно быть на один больше, чем количество цветов.

РЕДАКТИРОВАТЬ

Обратите внимание, что imshow принимает ключевое слово origin, которое задает, где назначена первая точка. По умолчанию используется "верхний левый угол", поэтому на моем опубликованном графике ось y имеет 0 в левом верхнем углу и 99 (не показано) в левом нижнем углу. Альтернативой является установка origin="lower", чтобы первая точка отображалась в левом нижнем углу.

РЕДАКТИРОВАТЬ 2

Если вы хотите использовать градиент, а не дискретную карту цветов, создайте карту цветов, линейно интерполируя последовательность цветов:

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")

Это производит: enter image description here

РЕДАКТИРОВАТЬ 3

Чтобы добавить сетку, как показано в этом примере, используйте метод grid. Установка цвета сетки на "белый" хорошо работает с цветами, используемыми цветовой картой (т.е. Черный по умолчанию плохо отображается).

pyplot.grid(True,color='white')

Включая это до того, savefig вызов savefig этот график (для ясности сделанный с использованием сетки 11x11): enter image description here Существует множество опций для grid, которые описаны в документации по matplotlib. Один из вас может заинтересовать это linewidth.

Ответ 2

Как насчет использования 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()

Это показывает:

enter image description here