gpt4 book ai didi

python - Matplotlib:垂直展开图例

转载 作者:太空狗 更新时间:2023-10-29 23:57:09 28 4
gpt4 key购买 nike

我有一个图表,其图例固定在右上角:如何扩展图例以适合图表的高度?

borderaxespad=0. 会水平扩展它,但我找不到等效的垂直扩展。

我正在使用 matplotlib 2.0

示例代码:

import numpy as np

x = np.linspace(0, 2*np.pi, 100)
data = [np.sin(x * np.pi/float(el)) for el in range(1, 5)]

fig, ax = plt.subplots(1)
for key, el in enumerate(data):
ax.plot(x, el, label=str(key))
ax.legend(bbox_to_anchor=(1.04,1), loc="upper left", borderaxespad=0., mode='expand')
plt.tight_layout(rect=[0,0,0.8,1])

产生:

enter image description here

最佳答案

首先解释问题的输出:当对 bbox_to_anchor 使用二元组表示法时,会创建一个没有范围的边界框。 mode="expand" 会将图例水平扩展到此边界框,该边界框的扩展为零,有效地将其缩小为零大小。

问题是 mode="expand" 只会水平扩展图例。来自 the documentation :

mode : {“expand”, None}
If mode is set to "expand" the legend will be horizontally expanded to fill the axes area (or bbox_to_anchor if defines the legend’s size).

要获得解决方案,您需要深入挖掘图例的内部结构。首先,您需要使用 4 元组设置 bbox-to-anchor,同时指定 bbox 的宽度和高度,bbox_to_anchor=(x0,y0,width,height),其中所有数字都是在归一化轴坐标中。然后你需要计算图例的_legend_box的高度。由于设置了一些填充,因此您需要从边界框的高度中减去该填充。为了计算填充,必须知道当前图例的字体大小。所有这些都必须在轴的位置最后一次更改之后发生。

import matplotlib.pyplot as plt
import numpy as np

x = np.linspace(0, 2*np.pi, 100)
data = [np.sin(x * np.pi/float(el)) for el in range(1, 5)]

fig, ax = plt.subplots(1)
for key, el in enumerate(data):
ax.plot(x, el, label=str(key))

# legend:
leg = ax.legend(bbox_to_anchor=(1.04,0.0,0.2,1), loc="lower left",
borderaxespad=0, mode='expand')

plt.tight_layout(rect=[0,0,0.8,1])

# do this after calling tight layout or changing axes positions in any way:
fontsize = fig.canvas.get_renderer().points_to_pixels(leg._fontsize)
pad = 2 * (leg.borderaxespad + leg.borderpad) * fontsize
leg._legend_box.set_height(leg.get_bbox_to_anchor().height-pad)

plt.show()

enter image description here

关于python - Matplotlib:垂直展开图例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46710546/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com