Kolorowanie "wykresu" macierzy 2D (matplotlib)

0

Hej,

Czy jest jakaś możliwość, aby standardowe kolory reprezentacji macierzy 2D zastąpić własnymi? Stworzyłem sobie dwa takie "wykresy", ale defaultowe kolory mi nie odpowiadają.

f1 = plt.figure()
f2 = plt.figure()
ax1 = f1.add_subplot(111)
ax2 = f2.add_subplot(111)

Po zastosowaniu:

ax1.imshow(array)
ax2.imshow(array)

Widzę wykresy, ale np. to co chcę, żeby było na zielono jest na żółto, itp.

Poza tym chciałbym też uzyskać skalę poziomą oraz pionową z interwałem co jeden, a widzę teraz na obu osiach podziałkę w postaci (0,2,4,6,8)

0

Możesz samemu zdefiniować colormap albo użyć gotowców. Właśnie jeden z takich gotowców ustawiony jest na wartość domyślną. Zdaje się, że jest to viridis. W poniższym przykładzie użyłem Oranges. Zmieniłem też podziałkę iksów:

import matplotlib.pyplot as plt
import numpy as np

N = 44
arr = np.arange(N).reshape(4,-1)

fig = plt.figure()
ax = fig.add_subplot(111)
ax.set_xticks(np.arange(N, step=1))
ax.imshow(arr, cmap='Oranges')
plt.show()

cmap.png

0

OK, w ten sposób sobie poradziłem, ale co jeśli np. chcę, aby pole arr(8,3) było wyświetlone na zielono, pole arr(2,1) na czerwono, a reszta na biało? Da się takie coś zrealizować?

1

colormap mapuje kolory w stosunku do wartości, jakie są przechowywane w macierzy. Najpierw zdefiniuj sobie paletę kolorów:

cmap = clr.ListedColormap(['w', 'g', 'r'])

W tym przypadku używamy kolejno białego, zielonego i czerwonego. Ich kolejność w liście ma znaczenie. W naszym przypadku mapowanie będzie się odbywać od białego, poprzez zielony, kończąc na czerwonym. Teraz wystarczy przygotować odpowiednią tablicę. Najniższe wartości będą odpowiadać białemu, a najwyższe czerwonemu. Sugeruję najprostszą postać:

[[0 0 0 0 0 0 0 0 0]
 [0 0 2 0 0 0 0 0 0]
 [0 0 0 0 0 0 0 0 0]
 [0 0 0 0 0 0 0 0 1]]

Na pozycjach arr(8,3) i arr(2,1) wstawiłem odpowiednio 1 i 2, które odpowiadają kolorom 'g' i 'r'. Cały kod:

import matplotlib.pyplot as plt
import matplotlib.colors as clr
import numpy as np

n, m = 9, 4
arr = np.zeros(n*m, dtype='int8').reshape(m, n)
arr[3][8] = 1
arr[1][2] = 2
cmap = clr.ListedColormap(['w', 'g', 'r'])

fig = plt.figure()
ax = fig.add_subplot(111)
ax.set_xticks(np.arange(n*m, step=1))
ax.set_yticks(np.arange(n*m, step=1))
ax.imshow(arr, cmap=cmap)
plt.show()

cm.png
P. S. Bardziej karkołomne rozwiązanie polega na zdefiniowaniu funkcji, która będzie konwertować każdy element macierzy na obiekt Rectangle.

0

Dokładnie o to mi chodziło, dzięki za pomoc! Teraz na podstawie Twojego rozwiązania będę mógł zaimplementować sobie to na własny użytek.

1 użytkowników online, w tym zalogowanych: 0, gości: 1