Estoy tratando de crear una cuadrícula usando una función imshow
como imshow
.
De esta matriz:
[[ 1 8 13 29 17 26 10 4], [16 25 31 5 21 30 19 15]]
Me gustaría trazar el valor como un color Y el valor del texto en sí (1,2, …) en la misma cuadrícula. Esto es lo que tengo por el momento (solo puedo trazar el color asociado a cada valor):
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()
Si, por alguna razón, tiene que usar una extensión diferente de la que se proporciona de forma natural mediante el imshow
el siguiente método (incluso si es más artificial) hace el trabajo:
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()
Si desea colocar otro tipo de datos y no necesariamente los valores que utilizó para la imagen, puede modificar el script anterior de la siguiente manera (valores agregados después de los datos):
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()
Desea recorrer los valores en la grid
y usar ax.text
para agregar la etiqueta a la gráfica.
Afortunadamente, para matrices 2D, numpy
tiene ndenumerate
, lo que hace esto bastante simple:
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')