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