2015-11-20 3 views
11

Я пытаюсь создать сетку, используя функцию matplotlib, такую ​​как imshow.
Из этого массива:Matplotlib: отображение значений массива с imshow

[[ 1 8 13 29 17 26 10 4], 
[16 25 31 5 21 30 19 15]] 

Я хотел бы построить значение, как и цвет самого текста значения (1,2, ...) на одной и той же сети. Это то, что у меня есть на данный момент (я могу только построить цвет, связанный с каждым значением):

from matplotlib import pyplot 
import numpy as np 

grid = np.array([[1,8,13,29,17,26,10,4],[16,25,31,5,21,30,19,15]]) 
print 'Here is the array' 
print grid 

fig1, (ax1, ax2)= pyplot.subplots(2, sharex = True, sharey = False) 
ax1.imshow(grid, interpolation ='none', aspect = 'auto') 
ax2.imshow(grid, interpolation ='bicubic', aspect = 'auto') 
pyplot.show() 

ответ

1

Если по какой-либо причине вы должны использовать различной степени от того, что является естественно, imshow следующий способ (даже при более надуманном) делает работу:

enter image description here

size = 4 
data = np.arange(size * size).reshape((size, size)) 

# Limits for the extent 
x_start = 3.0 
x_end = 9.0 
y_start = 6.0 
y_end = 12.0 

extent = [x_start, x_end, y_start, y_end] 

# The normal figure 
fig = plt.figure(figsize=(16, 12)) 
ax = fig.add_subplot(111) 
im = ax.imshow(data, extent=extent, origin='lower', interpolation='None', cmap='viridis') 

# Add the text 
jump_x = (x_end - x_start)/(2.0 * size) 
jump_y = (y_end - y_start)/(2.0 * size) 
x_positions = np.linspace(start=x_start, stop=x_end, num=size, endpoint=False) 
y_positions = np.linspace(start=y_start, stop=y_end, num=size, endpoint=False) 

for y_index, y in enumerate(y_positions): 
    for x_index, x in enumerate(x_positions): 
     label = data[y_index, x_index] 
     text_x = x + jump_x 
     text_y = y + jump_y 
     ax.text(text_x, text_y, label, color='black', ha='center', va='center') 

fig.colorbar(im) 
plt.show() 

Если вы хотите поставить другой тип данных и не обязательно те ценности, которые вы использовали для изображения вы можете изменить сценарий выше следующим образом (добавлены значения после данных):

enter image description here

size = 4 
data = np.arange(size * size).reshape((size, size)) 
values = np.random.rand(size, size) 

# Limits for the extent 
x_start = 3.0 
x_end = 9.0 
y_start = 6.0 
y_end = 12.0 

extent = [x_start, x_end, y_start, y_end] 

# The normal figure 
fig = plt.figure(figsize=(16, 12)) 
ax = fig.add_subplot(111) 
im = ax.imshow(data, extent=extent, origin='lower', interpolation='None', cmap='viridis') 

# Add the text 
jump_x = (x_end - x_start)/(2.0 * size) 
jump_y = (y_end - y_start)/(2.0 * size) 
x_positions = np.linspace(start=x_start, stop=x_end, num=size, endpoint=False) 
y_positions = np.linspace(start=y_start, stop=y_end, num=size, endpoint=False) 

for y_index, y in enumerate(y_positions): 
    for x_index, x in enumerate(x_positions): 
     label = values[y_index, x_index] 
     text_x = x + jump_x 
     text_y = y + jump_y 
     ax.text(text_x, text_y, label, color='black', ha='center', va='center') 

fig.colorbar(im) 
plt.show() 
11

Вы хотите петлю над значениями в grid и использовать ax.text, чтобы добавить метку к сюжету.

К счастью, для 2D массивов, numpy имеет ndenumerate, что делает это довольно просто:

for (j,i),label in np.ndenumerate(grid): 
    ax1.text(i,j,label,ha='center',va='center') 
    ax2.text(i,j,label,ha='center',va='center') 

enter image description here

+0

tom; из любопытства: такая петля, использующая 'ndenumerate' быстрее, чем ручная петля? – Bart

+1

нет, я так не думаю (хотя это может зависеть от размера «сетки»). Мне просто нравится простота кода по сравнению с 'для j в диапазоне (grid.shape [0]): для i в диапазоне (grid.shape [1]): ax.text (i, j, grid [ j, i]) ' – tom

+0

Могу ли я сделать это с помощью синего текста? –

Смежные вопросы