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

问题描述 投票:0回答:1

请帮我看看下面的代码

我想确保:

  1. 轴线保持正直
  2. 图例显示在轴的右边,并且必须在轴的外面。
  3. 图例不能与Y轴标签重叠。
  4. 必须使用函数'add_subplot'来创建子图,不能使用其他函数(如twinx...)

我想我们需要计算Y轴标签的边界,但我不知道怎么做,或者有其他方法可以自动计算吗?

以下是我的代码。


import numpy as np
import matplotlib.pyplot as plt

x1 = np.arange(10)   
x2 = x1*10 
y1 = x1*2
y2 = x1*10000

def adjust_subplot_layout(fig):
    for ax in fig.axes:
        x0,x1 = ax.get_xlim()
        y0,y1 = ax.get_ylim()
        ax.set_aspect((x1-x0)/(y1-y0))

def squarify(fig):
    adjust_subplot_layout(fig)

fig = plt.figure(figsize=(16,4))

loc_val = "upper right"
bbox_anchor = (1.15,1)

ax1 = fig.add_subplot(2,2,1)
ax2 = fig.add_subplot(2,2,1,frameon=False,sharex=ax1)
lg1 = ax1.plot(x1,y1,label='ax1')
lg2 = ax2.plot(x2,y2,label='ax2',color='tab:red')
ax2.get_yaxis().set_ticks_position('right') 
ax1.tick_params(axis='x', labelcolor='tab:blue') 
ax1.tick_params(axis='y', labelcolor='tab:red') 
ax2.tick_params(axis='y', labelcolor='tab:red') 
lga = lg1 + lg2
labs = [l.get_label() for l in lga]
ax1.legend(lga, labs, loc=loc_val ,bbox_to_anchor=bbox_anchor)
ax1.set_ylabel("ax1-ylabel")
ax2.set_ylabel("ax2-ylabel")
ax2.get_yaxis().set_label_position("right")


ax3 = fig.add_subplot(2,2,2)
ax4 = fig.add_subplot(2,2,2,frameon=False,sharex=ax3)
lg3 = ax3.plot(x1,y1,label='ax3')
lg4 = ax4.plot(x2,y2,label='ax4',color='tab:red')
ax4.get_yaxis().set_ticks_position('right') 
ax3.tick_params(axis='x', labelcolor='tab:blue') 
ax3.tick_params(axis='y', labelcolor='tab:red') 
ax4.tick_params(axis='y', labelcolor='tab:red') 
lgb = lg3 + lg4
labs = [l.get_label() for l in lgb]
ax3.legend(lgb, labs, loc=loc_val,bbox_to_anchor=bbox_anchor )
ax3.set_ylabel("ax3-ylabel")
ax4.set_ylabel("ax4-ylabel")
ax4.get_yaxis().set_label_position("right")

ax5 = fig.add_subplot(2,2,3)
ax6 = fig.add_subplot(2,2,3,frameon=False,sharex=ax5)
lg5 = ax5.plot(x1,y1,label='ax5')
lg6 = ax6.plot(x2,y2,label='ax6',color='tab:red')
ax6.get_yaxis().set_ticks_position('right') 
ax5.tick_params(axis='x', labelcolor='tab:blue') 
ax5.tick_params(axis='y', labelcolor='tab:red') 
ax6.tick_params(axis='y', labelcolor='tab:red') 
ax6.get_yaxis().set_label_position("right")
lgc = lg5 + lg6
labs = [l.get_label() for l in lgc]
ax5.legend(lgc, labs, loc=loc_val ,bbox_to_anchor=bbox_anchor )
ax5.set_ylabel("ax5-ylabel")
ax6.set_ylabel("ax6-ylabel")

adjust_subplot_layout(fig)
plt.show()

代码2

import numpy as np
import matplotlib.pyplot as plt
from matplotlib.pylab import mpl


x1 = np.arange(10)   
x2 = x1*10 
y1 = x1*2
y2 = x1*10000

def adjust_subplot_layout(fig):
    for ax in fig.axes:
        x0,x1 = ax.get_xlim()
        y0,y1 = ax.get_ylim()
        ax.set_aspect((x1-x0)/(y1-y0))

def squarify(fig):
    adjust_subplot_layout(fig)

fig = plt.figure(figsize=(6,4))

display_mode = 1 # 1 show the legend right
value = mpl.rcParams['figure.subplot.right']
print(value)
x = 1.6
if display_mode == 1:
    loc_val = "upper right"
    bbox_anchor = (value +x ,1.0)
else:
    loc_val = "lower left"
    bbox_anchor = (0., 1.02, 1., .102)

ax1 = fig.add_subplot(2,2,1)
ax2 = fig.add_subplot(2,2,1,frameon=False,sharex=ax1)
lg1 = ax1.plot(x1,y1,label='ax1')
lg2 = ax2.plot(x2,y2,label='ax2',color='tab:red')
ax2.get_yaxis().set_ticks_position('right')
ax1.tick_params(axis='x', labelcolor='tab:blue') 
ax1.tick_params(axis='y', labelcolor='tab:red') 
ax2.tick_params(axis='y', labelcolor='tab:red') 
lga = lg1 + lg2
labs = [l.get_label() for l in lga]

if display_mode == 1:
    ax1.legend(lga, labs, loc=loc_val ,bbox_to_anchor=bbox_anchor)
else:
    ax1.legend(lga, labs, loc=loc_val ,bbox_to_anchor=bbox_anchor, ncol=2, borderaxespad=0.)
ax1.set_ylabel("ax1-ylabel")
ax2.set_ylabel("ax2-ylabel")
ax2.get_yaxis().set_label_position("right")


ax3 = fig.add_subplot(2,2,2)
ax4 = fig.add_subplot(2,2,2,frameon=False,sharex=ax3)
lg3 = ax3.plot(x1,y1,label='ax3')
lg4 = ax4.plot(x2,y2,label='ax4',color='tab:red')
ax4.get_yaxis().set_ticks_position('right')
ax3.tick_params(axis='x', labelcolor='tab:blue') 
ax3.tick_params(axis='y', labelcolor='tab:red') 
ax4.tick_params(axis='y', labelcolor='tab:red') 
lgb = lg3 + lg4
labs = [l.get_label() for l in lgb]

if display_mode == 1:
    ax3.legend(lga, labs, loc=loc_val ,bbox_to_anchor=bbox_anchor)
else:
    ax3.legend(lga, labs, loc=loc_val ,bbox_to_anchor=bbox_anchor, ncol=2, borderaxespad=0.)

ax3.set_ylabel("ax3-ylabel")
ax4.set_ylabel("ax4-ylabel")
ax4.get_yaxis().set_label_position("right")

ax5 = fig.add_subplot(2,2,3)
ax6 = fig.add_subplot(2,2,3,frameon=False,sharex=ax5)
lg5 = ax5.plot(x1,y1,label='ax5')
lg6 = ax6.plot(x2,y2,label='ax6',color='tab:red')
ax6.get_yaxis().set_ticks_position('right')
ax5.tick_params(axis='x', labelcolor='tab:blue') 
ax5.tick_params(axis='y', labelcolor='tab:red') 
ax6.tick_params(axis='y', labelcolor='tab:red') 
ax6.get_yaxis().set_label_position("right")
lgc = lg5 + lg6
labs = [l.get_label() for l in lgc]
if display_mode == 1:
    ax5.legend(lga, labs, loc=loc_val ,bbox_to_anchor=bbox_anchor)
else:
    ax5.legend(lga, labs, loc=loc_val ,bbox_to_anchor=bbox_anchor, ncol=2, borderaxespad=0.)
ax5.set_ylabel("ax5-ylabel")
ax6.set_ylabel("ax6-ylabel")


fig.set_tight_layout(True)
adjust_subplot_layout(fig)
#fig.canvas.mpl_connect("draw_event", lambda evt: squarify(fig))
#fig.tight_layout()
plt.show()


python matplotlib legend axis axes
1个回答
© www.soinside.com 2019 - 2024. All rights reserved.