Cal*_*ris 12 python plot position matplotlib legend
我正在创建一个包含多个子图的图形.其中一个子图给我带来了一些麻烦,因为没有任何轴角或中心可以自由(或者可以释放)来放置图例.我想做的是将图例放在"左上"和"左中"位置之间的某处,同时保持它与y轴之间的填充等于其他子图中的图例(即使用其中一个预定义的图例位置关键字放置.
我知道我可以通过使用指定自定义位置loc=(x,y),但是我无法弄清楚如何使图例和y轴之间的填充等于其他图例所使用的填充.是否有可能以某种方式使用borderaxespad第一个传奇的属性?虽然我没有成功地让它发挥作用.
任何建议都是最受欢迎的!
编辑:这是一个(非常简化)问题的插图:
import matplotlib.pyplot as plt
fig, ax = plt.subplots(1, 2, sharex=False, sharey=False)
ax[0].axhline(y=1, label='one')
ax[0].axhline(y=2, label='two')
ax[0].set_ylim([0.8,3.2])
ax[0].legend(loc=2)
ax[1].axhline(y=1, label='one')
ax[1].axhline(y=2, label='two')
ax[1].axhline(y=3, label='three')
ax[1].set_ylim([0.8,3.2])
ax[1].legend(loc=2)
plt.show()
Run Code Online (Sandbox Code Playgroud)

我想要的是右图中的图例稍微向下移动,因此它不再与线重叠.作为最后的手段我可以改变轴限制,但我非常想避免这种情况.
The*_*ude 11
我看到你发布的答案并试了一下.然而问题是它还取决于数字大小.
这是一个新的尝试:
import numpy
import matplotlib.pyplot as plt
x = numpy.linspace(0, 10, 10000)
y = numpy.cos(x) + 2.
x_value = .014 #Offset by eye
y_value = .55
fig, ax = plt.subplots(1, 2, sharex = False, sharey = False)
fig.set_size_inches(50,30)
ax[0].plot(x, y, label = "cos")
ax[0].set_ylim([0.8,3.2])
ax[0].legend(loc=2)
line1 ,= ax[1].plot(x,y)
ax[1].set_ylim([0.8,3.2])
axbox = ax[1].get_position()
fig.legend([line1], ["cos"], loc = (axbox.x0 + x_value, axbox.y0 + y_value))
plt.show()
Run Code Online (Sandbox Code Playgroud)
所以我现在正在做的是从子图中获取坐标.然后,我根据整个图形的尺寸创建图例.因此,图形大小不再改变图例定位的任何内容.
使用值x_value和y_value图例可以定位在子图中.x_value因为与"正常"的传说有良好的对应关系.可以根据需要更改此值.y_value确定图例的高度.

祝好运!
在花了太多时间之后,我想出了以下令人满意的解决方案(转换教程肯定有帮助):
bapad = plt.rcParams['legend.borderaxespad']
fontsize = plt.rcParams['font.size']
axline = plt.rcParams['axes.linewidth'] #need this, otherwise the result will be off by a few pixels
pad_points = bapad*fontsize + axline #padding is defined in relative to font size
pad_inches = pad_points/72.0 #convert from points to inches
pad_pixels = pad_inches*fig.dpi #convert from inches to pixels using the figure's dpi
Run Code Online (Sandbox Code Playgroud)
然后,我发现以下两个工作并为padding提供相同的值:
# Define inverse transform, transforms display coordinates (pixels) to axes coordinates
inv = ax[1].transAxes.inverted()
# Inverse transform two points on the display and find the relative distance
pad_axes = inv.transform((pad_pixels, 0)) - inv.transform((0,0))
pad_xaxis = pad_axes[0]
Run Code Online (Sandbox Code Playgroud)
要么
# Find how may pixels there are on the x-axis
x_pixels = ax[1].transAxes.transform((1,0)) - ax[1].transAxes.transform((0,0))
# Compute the ratio between the pixel offset and the total amount of pixels
pad_xaxis = pad_pixels/x_pixels[0]
Run Code Online (Sandbox Code Playgroud)
然后设置图例:
ax[1].legend(loc=(pad_xaxis,0.6))
Run Code Online (Sandbox Code Playgroud)
情节:
