Я пытаюсь использовать twinx с цветовой шкалой, созданной с помощью make_axes. В другом вопросе я видел, что это может быть сложно, потому что axes_grid1 позиционирует оси только во время рисования (здесь ). Но я не смог адаптировать решение к моей проблеме.
Вот мой код:
import numpy as np
import matplotlib.pyplot as plt
from mpl_toolkits.axes_grid1 import make_axes_locatable
def func_colorbar(mappable,cax=None,size="5%",pad=0.05,position='right',extend='neither'):
ax = mappable.axes
fig = ax.figure
if position=='right':
orientation='vertical'
else:
orientation='horizontal'
if cax is None:
divider = make_axes_locatable(ax)
cax = divider.append_axes(position, size=size, pad=pad)
if position=='top':
cax.xaxis.tick_top()
return fig.colorbar(mappable, cax=cax,extend=extend,orientation=orientation)
x=np.linspace(0,1,100)
y=np.linspace(0,1,100)
z=x*y
fig,axe=plt.subplots(1,1,figsize=(10,10))
im=axe.scatter(x,y,c=z)
ax2=axe.twinx()
ax2.plot(x,x**2)
func_colorbar(im)
plt.show()
Добавление ax2 портит макет. Ожидаемый результат можно получить, просто изменив func_colorbar (im) на fig.colorbar (im), но мне любопытно узнать, как можно решить проблему, если я хочу использовать axes_grid1 (которая иногда может быть полезна). Ниже вы найдете то, что я попробовал, после ответа на этот вопрос . Однако, похоже, что он не работает ...
x=np.linspace(0,1,100)
y=np.linspace(0,1,100)
z=x*y
fig,axe=plt.subplots(1,1,figsize=(10,10))
im=axe.scatter(x,y,c=z)
ax2=axe.twinx()
ax2.plot(x,x**2)
func_colorbar(im)
def resize(event):
axpos = axe.get_position()
newpos = [axpos.x0, axpos.y0, axpos.width, axpos.height]
ax2.set_position(newpos)
cid = fig.canvas.mpl_connect('draw_event', resize)
cid2 = fig.canvas.mpl_connect('resize_event', resize)
plt.show()
Спасибо за вашу помощь!