Matplotlib - двойной с make_axes_locatable - PullRequest
0 голосов
/ 29 апреля 2020

Я пытаюсь использовать 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()

Спасибо за вашу помощь!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...