Избегайте изменения размера фигуры при добавлении plot() в imshow()

Я хочу добавить строку с plot() в цветовую карту, сделанную с помощью imshow() в matplotlib, где предполагается несколько фигур разного размера. При добавлении строки карта цветов как-то меняет размер. Как мне обойти это?

Вот простой пример, иллюстрирующий проблему:

import scipy.stats       as stat
import matplotlib.pyplot as plt
import matplotlib.cm     as cm
import numpy             as np

fig = plt.figure(figsize=(12, 4))
plt.axes([.05,.1,.4,.8])
data = stat.uniform.rvs(size=2400).reshape((40,60))
plt.imshow(data,cmap=cm.jet,vmin=0,vmax=1)
plt.colorbar(fraction=.03)
plt.plot(range(60),20*np.ones(60),'w-',lw=3)  #  <-- causing problems
plt.title('the damn white line')

person user1227298    schedule 10.05.2013    source источник
comment
Перед построением графика отключите автомасштабирование или установите для него значение «tight», см.: stackoverflow.com/questions/16157180/   -  person Rutger Kassies    schedule 10.05.2013
comment
Как упоминал @RutgerKassies, этого можно избежать с помощью команды plt.autoscale(False). Кроме того, на мой взгляд, было бы лучшим решением использовать plt.axhline(y=20, c='w', lw=3), а не plt.plot(range(60),20*np.ones(60),'w-',lw=3), поскольку axhline охватывает всю горизонтальную протяженность осей, даже если вы перемещаете/масштабируете график.   -  person sodd    schedule 10.05.2013
comment
@nordev Вы должны опубликовать это как ответ   -  person tacaswell    schedule 10.05.2013
comment
@user1227298 user1227298 Если вы нашли обходной путь, вы также должны опубликовать его как ответ.   -  person tacaswell    schedule 10.05.2013
comment
@nordev, это был просто пример. реальный сюжет имеет реальную кривую.   -  person user1227298    schedule 13.05.2013


Ответы (2)


Вы можете избежать этого с помощью команды plt.autoscale(False) после первого сюжета.

Кроме того, на мой взгляд, было бы лучшим решением использовать plt.axhline вместо plt.plot для создания горизонтальной линии, поскольку axhline охватывает всю горизонтальную протяженность осей, даже если вы панорамируете/масштабируете график.

Другими словами, ваш пример можно было бы переписать так:

import scipy.stats       as stat
import matplotlib.pyplot as plt
import matplotlib.cm     as cm
import numpy             as np

data = stat.uniform.rvs(size=2400).reshape((40,60))

plt.figure(figsize=(12, 4))
plt.axes([.05,.1,.4,.8])
plt.imshow(data,cmap=cm.jet,vmin=0,vmax=1)
plt.colorbar(fraction=.03)
plt.autoscale(False)
plt.axhline(y=20, c='w', lw=3)
plt.title('the damn white line')

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

person sodd    schedule 10.05.2013

Вот очень простое альтернативное решение: изменение порядка imshow() и plot()

import scipy.stats       as stat
import matplotlib.pyplot as plt
import matplotlib.cm     as cm
import numpy             as np

fig = plt.figure(figsize=(12, 4))
plt.axes([.05,.1,.4,.8])
data = stat.uniform.rvs(size=2400).reshape((40,60))
plt.plot(range(60),20*np.ones(60),'w-',lw=3)  #  <--- mow before imshow()
plt.imshow(data,cmap=cm.jet,vmin=0,vmax=1)
plt.colorbar(fraction=.03)
plt.title('the damn white line')

Вывод такой же, как и для ответа nordev.

person user1227298    schedule 13.05.2013