2014-01-12 4 views
9

Я готовлю Numpy матрицу затем использовать Matplotlib для построения матрицы, такие как:Matplotlib сюжет Numpy матрица как 0 индекс

>>> import numpy 
>>> import matplotlib.pylab as plt 
>>> m = [[0.0, 1.47, 2.43, 3.44, 1.08, 2.83, 1.08, 2.13, 2.11, 3.7], [1.47, 0.0, 1.5,  2.39, 2.11, 2.4, 2.11, 1.1, 1.1, 3.21], [2.43, 1.5, 0.0, 1.22, 2.69, 1.33, 3.39, 2.15, 2.12, 1.87], [3.44, 2.39, 1.22, 0.0, 3.45, 2.22, 4.34, 2.54, 3.04, 2.28], [1.08, 2.11, 2.69, 3.45, 0.0, 3.13, 1.76, 2.46, 3.02, 3.85], [2.83, 2.4, 1.33, 2.22, 3.13, 0.0, 3.83, 3.32, 2.73, 0.95], [1.08, 2.11, 3.39, 4.34, 1.76, 3.83, 0.0, 2.47, 2.44, 4.74], [2.13, 1.1, 2.15, 2.54, 2.46, 3.32, 2.47, 0.0, 1.78, 4.01], [2.11, 1.1, 2.12, 3.04, 3.02, 2.73, 2.44, 1.78, 0.0, 3.57], [3.7, 3.21, 1.87, 2.28, 3.85, 0.95, 4.74, 4.01, 3.57, 0.0]] 
>>> matrix = numpy.matrix(m) 
>>> matrix 
matrix([ 
    [ 0. , 1.47, 2.43, 3.44, 1.08, 2.83, 1.08, 2.13, 2.11, 3.7 ], 
    [ 1.47, 0. , 1.5 , 2.39, 2.11, 2.4 , 2.11, 1.1 , 1.1 , 3.21], 
    [ 2.43, 1.5 , 0. , 1.22, 2.69, 1.33, 3.39, 2.15, 2.12, 1.87], 
    [ 3.44, 2.39, 1.22, 0. , 3.45, 2.22, 4.34, 2.54, 3.04, 2.28], 
    [ 1.08, 2.11, 2.69, 3.45, 0. , 3.13, 1.76, 2.46, 3.02, 3.85], 
    [ 2.83, 2.4 , 1.33, 2.22, 3.13, 0. , 3.83, 3.32, 2.73, 0.95], 
    [ 1.08, 2.11, 3.39, 4.34, 1.76, 3.83, 0. , 2.47, 2.44, 4.74], 
    [ 2.13, 1.1 , 2.15, 2.54, 2.46, 3.32, 2.47, 0. , 1.78, 4.01], 
    [ 2.11, 1.1 , 2.12, 3.04, 3.02, 2.73, 2.44, 1.78, 0. , 3.57], 
    [ 3.7 , 3.21, 1.87, 2.28, 3.85, 0.95, 4.74, 4.01, 3.57, 0. ] 
]) 
>>> fig = plt.figure() 
>>> ax = fig.add_subplot(1,1,1) 
>>> ax.set_aspect('equal') 
>>> plt.imshow(matrix, interpolation='nearest', cmap=plt.cm.ocean) 
>>> plt.colorbar() 
>>> plt.show() 

График показывает, как это:

enter image description here

Это отлично, за исключением того, что мне хотелось бы, чтобы мои оси двигались от 1 до 10, а не от 0 до 9 (из индексации python 0)

Есть ли простой способ сделать это?

Большое спасибо!

+0

Обратите внимание, что ось x и ось y находятся в диапазоне '[-0.5, 9.5]' – Christian

ответ

8

Вы можете использовать extent необязательный параметр функции plt.imshow(), которая документально here. Как это:

#All the stuff earlier in the program 
plt.imshow(matrix, interpolation='nearest', cmap=plt.cm.ocean, extent=(0.5,10.5,0.5,10.5)) 
plt.colorbar() 
plt.show() 

Для матрицы с произвольной формы, вы можете изменить этот код, чтобы что-то вроде этого:

#All the stuff earlier in the program 
plt.imshow(matrix, interpolation='nearest', cmap=plt.cm.ocean, 
    extent=(0.5,numpy.shape(matrix)[0]+0.5,0.5,numpy.shape(matrix)[1]+0.5)) 
plt.colorbar() 
plt.show() 

Это создает сюжет, который выглядит следующим образом:

Plot output

+0

Спасибо! Существуют ли какие-либо преимущества в использовании, а не метод Христиана ниже? – GarethPrice

+1

@GarethPrice: Я предполагаю, что конкретный способ, который я установил, будет работать лучше, если бы у вас была, скажем, матрица 1000x1000, так как она позволяет numpy выбирать, как тики должны располагаться на расстоянии. Кроме того, они почти одинаковы, и метод Христиана не должен сильно меняться, чтобы заставить его работать так же. – Dan

+1

Я думаю, что всегда было бы предпочтительнее контролировать что-то подобное из команды plot. Другой метод требует возиться с объектами 'axis' и учитывать, когда вы« показываете »и т. Д. Если вы заранее знаете, что хотите, чтобы оси были определенным образом, лучше сделать их правильными для начала. – mmdanziger

2

Чтобы получить желаемый результат добавить эти строки после того, как ваш код, но перед темplt.show():

... 
labels = [0, 1, 3, 5, 7, 9] 
ax.set_xticklabels(labels) 
plt.show() 

Обратите внимание, что по оси Х и оси Y находятся в диапазоне [-0.5, 9.5] не ИНТ [0, 9]

Редактировать:

Чтобы сделать это более гибким способом (фактически, другим способом показанного выше):

labels = range(0, len(m[0])) 
plt.xticks(labels) 
plt.show() 

Выход:

enter image description here

+0

Спасибо! Точно так же и с Дэном, есть ли какие-то преимущества для этого, а не в использовании? – GarethPrice

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