Визуализация данных 2D grid в 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
709   2  

2 ответов:

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

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

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

Введите описание изображения здесь

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

EDIT

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

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

Это производит: Введите описание изображения здесь

Править 3

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

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

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

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

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

Введите описание изображения здесь

Comments

    Ничего не найдено.