#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)
Результат: