英文:
Modify the legend placement of a figure
问题
我使用一个返回matplotlib.figure
对象和图例的程序包。我想要更改图例的边界框和位置。在查看了https://matplotlib.org/stable/api/figure_api.html后,我尝试按照以下方式检索图例:
ax = f.axes[0]
lgd_f = f.legend()
lgd = ax.get_legend_handles_labels()
print(lgd_f)
print(lgd)
ax.get_legend().set_bbox_to_anchor((1, 1.05))
ax.legend(bbox_to_anchor=(1, 1.05), loc=8)
然而,这并没有像预期的那样起作用,因为在轴上调用get_legend_handles_labels
方法会返回两个空列表。不幸的是,无法修改程序包的内部。假设这是可能的,你能指导我正确的方向吗?
英文:
I am using a package program that return me a matplotlib.figure
object together with a legend. I want to change the bounding box and placement of the legend. After checking https://matplotlib.org/stable/api/figure_api.html I tried to retrieve the legend as follows:
ax = f.axes[0]
lgd_f = f.legend()
lgd = ax.get_legend_handles_labels()
print(lgd_f)
print(lgd)
ax.get_legend().set_bbox_to_anchor((1, 1.05))
ax.legend(bbox_to_anchor=(1, 1.05), loc=8)
However, this did not work as expected as calling the get_legend_handles_labels
method on the axes returns two empty lists. Unfortunately it is not possible to modify the internals of the package program. Assuming this is possible could you point me in the right direction?
答案1
得分: 3
The OP在this comment中表示他们遇到了"空列表"的问题。幸运的是,我没有遇到这个问题。
解决方案来自于OP发布的代码,唯一的问题是将图例的位置从默认值(0)更改为请求的位置 — 使用了图例对象的私有方法来解决。
import matplotlib.pyplot as plt
def plot():
f, a = plt.subplots()
a.plot((0,1),(0,1), label='SW-NE')
a.plot((0,1),(1,0), label='NW-SE')
plt.legend()
return f
f = plot()
a = f.axes[0]
l = a.get_legend()
l.set_bbox_to_anchor((1, 1.05))
l._set_loc(8) # "private" method
f.set_layout_engine('constrained')
plt.show()
英文:
The OP stated in this comment that they had a problem with "empty lists". Fortunately I experienced no such problem.
The solution follows from the code the OP posted, the only issue being changing the location of the Legend from default (0) to the requested one — solved using a private method of the Legend object.
import matplotlib.pyplot as plt
def plot():
f, a = plt.subplots()
a.plot((0,1),(0,1), label='SW-NE')
a.plot((0,1),(1,0), label='NW-SE')
plt.legend()
return f
f = plot()
a = f.axes[0]
l = a.get_legend()
l.set_bbox_to_anchor((1, 1.05))
l._set_loc(8) # "private" method
f.set_layout_engine('constrained')
plt.show()
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论