Python 如何确保图例不会与右侧Y轴上的标签重叠

Python 如何确保图例不会与右侧Y轴上的标签重叠,python,matplotlib,legend,axis,axes,Python,Matplotlib,Legend,Axis,Axes,请帮我查一下下面的代码 我要确保: 轴线保持垂直 图例显示在轴的右侧,并且必须位于轴的外部 图例不能与y轴标签重叠 必须使用函数“添加子批次”来创建子批次,不能使用其他函数(例如twinx…) 我想我们需要计算y轴标签的边界,但我不知道怎么做。 或者有没有其他方法可以自动完成 以下是我的代码: 将numpy作为np导入 将matplotlib.pyplot作为plt导入 x1=np.arange(10) x2=x1*10 y1=x1*2 y2=x1*10000 def调整子批次布局(图): 对

请帮我查一下下面的代码

我要确保:

  • 轴线保持垂直
  • 图例显示在轴的右侧,并且必须位于轴的外部
  • 图例不能与y轴标签重叠
  • 必须使用函数“添加子批次”来创建子批次,不能使用其他函数(例如twinx…)
  • 我想我们需要计算y轴标签的边界,但我不知道怎么做。 或者有没有其他方法可以自动完成

    以下是我的代码:

    
    将numpy作为np导入
    将matplotlib.pyplot作为plt导入
    x1=np.arange(10)
    x2=x1*10
    y1=x1*2
    y2=x1*10000
    def调整子批次布局(图):
    对于图轴中的ax:
    x0,x1=ax.get_xlim()
    y0,y1=ax.get_ylim()
    ax.set_纵横比((x1-x0)/(y1-y0))
    def squarify(图):
    调整子地块布局(图)
    图=plt.图(图尺寸=(16,4))
    loc_val=“右上角”
    bbox_锚=(1.15,1)
    ax1=图add_子批次(2,2,1)
    ax2=fig.add_子批次(2,2,1,frameon=False,sharex=ax1)
    lg1=ax1.绘图(x1,y1,label='ax1')
    lg2=ax2.绘图(x2,y2,标签='ax2',颜色='tab:red')
    ax2.get_yaxis().设置标记位置('right')
    ax1.勾选参数(axis='x',labelcolor='tab:blue')
    ax1.勾选参数(轴为y,标签颜色为tab:red)
    ax2.勾选参数(轴为y,标签颜色为tab:red)
    lga=lg1+lg2
    labs=[l.获取lga中l的标签()
    ax1.图例(lga、实验室、loc=loc\U val、bbox\U至\U锚定=bbox\U锚定)
    ax1.set_ylabel(“ax1 ylabel”)
    ax2.set_ylabel(“ax2 ylabel”)
    ax2.get_yaxis().设置标签位置(“右”)
    ax3=图add_子批次(2,2,2)
    ax4=图add_子批次(2,2,2,frameon=False,sharex=ax3)
    lg3=ax3.绘图(x1,y1,label='ax3')
    lg4=ax4.绘图(x2,y2,标签='ax4',颜色='tab:red')
    ax4.get_yaxis().设置标记位置('right')
    ax3.勾选参数(axis='x',labelcolor='tab:blue')
    ax3.勾选参数(轴为y,标签颜色为tab:red)
    ax4.勾选参数(轴为y,标签颜色为tab:red)
    lgb=lg3+lg4
    labs=[l.get_label()表示lgb中的l]
    ax3.图例(lgb、实验室、loc=loc_val、bbox_至_锚定=bbox_锚定)
    ax3.set_ylabel(“ax3 ylabel”)
    ax4.set_ylabel(“ax4 ylabel”)
    ax4.get_yaxis().设置标签位置(“右”)
    ax5=图add_子批次(2,2,3)
    ax6=图add_子批次(2,2,3,frameon=False,sharex=ax5)
    lg5=ax5.绘图(x1,y1,标签='ax5')
    lg6=ax6.绘图(x2,y2,标签='ax6',颜色='tab:red')
    ax6.get_yaxis().设置标记位置('right')
    ax5.勾选参数(axis='x',labelcolor='tab:blue')
    ax5.勾选参数(轴为y,标签颜色为tab:red)
    ax6.勾选参数(轴='y',标签颜色='tab:red')
    ax6.get_yaxis().设置标签位置(“右”)
    lgc=lg5+lg6
    labs=[l.get_label()表示lgc中的l]
    ax5.图例(lgc、实验室、loc=loc\U val、bbox\U至\U锚定=bbox\U锚定)
    ax5.设置标签(“ax5标签”)
    ax6.set_ylabel(“ax6 ylabel”)
    调整子地块布局(图)
    plt.show()
    
    代码2

    将numpy导入为np
    将matplotlib.pyplot作为plt导入
    从matplotlib.pylab导入mpl
    x1=np.arange(10)
    x2=x1*10
    y1=x1*2
    y2=x1*10000
    def调整子批次布局(图):
    对于图轴中的ax:
    x0,x1=ax.get_xlim()
    y0,y1=ax.get_ylim()
    ax.set_纵横比((x1-x0)/(y1-y0))
    def squarify(图):
    调整子地块布局(图)
    图=零件图(图尺寸=(6,4))
    显示模式=1#1向右显示图例
    value=mpl.rcParams['figure.subplot.right']
    打印(值)
    x=1.6
    如果显示模式=1:
    loc_val=“右上角”
    bbox_锚=(值+x,1.0)
    其他:
    loc_val=“左下”
    bbox_锚=(0,1.02,1.,.102)
    ax1=图add_子批次(2,2,1)
    ax2=fig.add_子批次(2,2,1,frameon=False,sharex=ax1)
    lg1=ax1.绘图(x1,y1,label='ax1')
    lg2=ax2.绘图(x2,y2,标签='ax2',颜色='tab:red')
    ax2.get_yaxis().设置标记位置('right')
    ax1.勾选参数(axis='x',labelcolor='tab:blue')
    ax1.勾选参数(轴为y,标签颜色为tab:red)
    ax2.勾选参数(轴为y,标签颜色为tab:red)
    lga=lg1+lg2
    labs=[l.获取lga中l的标签()
    如果显示模式=1:
    ax1.图例(lga、实验室、loc=loc\U val、bbox\U至\U锚定=bbox\U锚定)
    其他:
    ax1.图例(lga、labs、loc=loc_val、bbox_至_锚定=bbox_锚定、ncol=2、borderaxespad=0。)
    ax1.set_ylabel(“ax1 ylabel”)
    ax2.set_ylabel(“ax2 ylabel”)
    ax2.get_yaxis().设置标签位置(“右”)
    ax3=图add_子批次(2,2,2)
    ax4=图add_子批次(2,2,2,frameon=False,sharex=ax3)
    lg3=ax3.绘图(x1,y1,label='ax3')
    lg4=ax4.绘图(x2,y2,标签='ax4',颜色='tab:red')
    ax4.get_yaxis().设置标记位置('right')
    ax3.勾选参数(axis='x',labelcolor='tab:blue')
    ax3.勾选参数(轴为y,标签颜色为tab:red)
    ax4.勾选参数(轴为y,标签颜色为tab:red)
    lgb=lg3+lg4
    labs=[l.get_label()表示lgb中的l]
    如果显示模式=1:
    ax3.图例(lga、实验室、loc=loc\U val、bbox\U至\U锚定=bbox\U锚定)
    其他:
    ax3.图例(lga,实验室,loc=loc_val,bbox_至_锚=bbox_锚,ncol=2,borderaxespad=0。)
    ax3.set_ylabel(“ax3 ylabel”)
    ax4.set_ylabel(“ax4 ylabel”)
    ax4.get_yaxis().设置标签位置(“右”)
    ax5=图add_子批次(2,2,3)
    ax6=图add_子批次(2,2,3,frameon=False,sharex=ax5)
    lg5=ax5.绘图(x1,y1,标签='ax5')
    lg6=ax6.绘图(x2,y2,标签='ax6',颜色='tab:red')
    ax6.get_yaxis().设置标记位置('right')
    ax5.勾选参数(axis='x',labelcolor='tab:blue')
    ax5.勾选参数(轴为y,标签颜色为tab:red)
    ax6.勾选参数(轴='y',标签颜色='tab:red')
    ax6.get_yaxis().设置标签位置(“右”)
    lgc=lg5+lg6
    labs=[l.get_label()表示lgc中的l]
    如果显示模式=1:
    ax5.图例(lga、实验室、loc=loc\U val、bbox\U至\U锚定=bbox\U锚定)
    其他:
    ax5.图例(lga、labs、loc=loc_val、bbox_至_锚定=bbox_锚定、ncol=2、borderaxespad=0)
    ax5.设置标签(“ax5标签”)
    ax6.set_ylabel(“ax6 ylabel”)
    图设置紧密布局(真)
    调整子地块布局(图)
    #图canvas.mpl_connect(“draw_事件”,lambda evt:squarify(图))
    #图1紧_布局图()
    plt.show()
    
    至于您的第二个请求,我想知道是否可以将其更改为
    bbox\u anchor=(1,1)
    。谢谢,我不清楚我的要求,图例必须在轴之外。我将把它添加到问题中,如下所示