Matplotlib: imshow со второй осью y

#python #matplotlib #heatmap

#matplotlib #imshow #yaxis

Вопрос:

Я пытаюсь построить двумерный массив в matplotlib с помощью imshow() и наложить его диаграммой рассеяния на вторую ось y.

 oneDim = np.array([0.5,1,2.5,3.7])
twoDim = np.random.rand(8,4)

plt.figure()
ax1 = plt.gca()

ax1.imshow(twoDim, cmap='Purples', interpolation='nearest')
ax1.set_xticks(np.arange(0,twoDim.shape[1],1))
ax1.set_yticks(np.arange(0,twoDim.shape[0],1))
ax1.set_yticklabels(np.arange(0,twoDim.shape[0],1))
ax1.grid()

#This is the line that causes problems
ax2 = ax1.twinx()

#That's not really part of the problem (it seems)
oneDimX = oneDim.shape[0]
oneDimY = 4
ax2.plot(np.arange(0,oneDimX,1),oneDim)
ax2.set_yticks(np.arange(0,oneDimY 1,1))
ax2.set_yticklabels(np.arange(0,oneDimY 1,1))
 

Если я запускаю все только до последней строки, я получаю полностью визуализированный массив:

Вот как это должно выглядеть!

Однако, если я добавлю вторую ось y (ax2= ax1.twinx()) в качестве подготовки к диаграмме рассеяния, она изменится на этот неполный рендеринг:

Неполная визуализация массива

В чем проблема? Я оставил несколько строк в приведенном выше коде, описывающих добавление диаграммы рассеяния, хотя, похоже, это не является частью проблемы.

Комментарии:

1. Воспроизведено на Python 2.7, matplotlib 2.1.1. Это вполне может быть ошибкой

2. Аналогичная система здесь: Python 2.7.12, Matplotlib 2.1.1. @DavidG если это окажется ошибкой, существуют ли какие-либо обходные пути для достижения этого наложения с двумя осями y?

3. На github есть дискуссия по этому вопросу. По — видимому , это как — то связано с imshow форсированием соотношения сторон ax1 . Если вы установите ax1.set_aspect('auto') все изображение, и график будет показан правильно, но изображение будет сильно искажено.

Ответ №1:

После обсуждения на GitHub, на которое указал Томас Кюн, проблема была исправлена несколько дней назад. В отсутствие легкодоступной сборки, вот исправление с использованием свойства aspect= ‘auto’ . Чтобы получить красивые обычные поля, я скорректировал фигуру x / y, используя размеры массива. Функция автоматического масштабирования оси использовалась для удаления некоторых дополнительных белых границ.

 oneDim = np.array([0.5,1,2.5,3.7])
twoDim = np.random.rand(8,4)

plt.figure(figsize=(twoDim.shape[1]/2,twoDim.shape[0]/2))
ax1 = plt.gca()

ax1.imshow(twoDim, cmap='Purples', interpolation='nearest', aspect='auto')
ax1.set_xticks(np.arange(0,twoDim.shape[1],1))
ax1.set_yticks(np.arange(0,twoDim.shape[0],1))
ax1.set_yticklabels(np.arange(0,twoDim.shape[0],1))
ax1.grid()

ax2 = ax1.twinx()

#Required to remove some white border
ax1.autoscale(False)
ax2.autoscale(False)
 

Результат:

введите описание изображения здесь