即使调整图形大小,如何获得图例和轴之间的恒定距离?

当使用bbox_to_anchoras in this answer将图例放置在轴之外时,轴和图例之间的空间会在调整图形大小时发生变化。对于静态导出的图,这很好;你可以简单地调整数字,直到你做对了。但是对于您可能想要调整大小的交互式绘图,这是一个问题。从这个例子中可以看出:


import numpy as np

from matplotlib import pyplot as plt


x = np.arange(5)

y = np.random.randn(5)


fig, ax = plt.subplots(tight_layout=True)

ax.plot(x, y, label='data1')

ax.plot(x, y-1, label='data2')

legend = ax.legend(loc='upper center', bbox_to_anchor=(0.5, -0.05), ncol=2)

plt.show()

结果:

http://img.mukewang.com/61b054300001023a12790477.jpg

即使调整图形大小,如何确保图例与轴的距离相同?


哈士奇WWW
浏览 228回答 2
2回答

饮歌长啸

图例与边界框边缘的距离由borderaxespad参数设置。的borderaxespad是在字体大小的倍数为单位-使它自动独立的轴尺寸。所以在这种情况下,import matplotlib.pyplot as pltimport numpy as npx = np.arange(5)y = np.random.randn(5)fig, ax = plt.subplots(constrained_layout=True)ax.plot(x, y, label='data1')ax.plot(x, y-1, label='data2')legend = ax.legend(loc="upper center", bbox_to_anchor=(0.5,0), borderaxespad=2)plt.show()在轴图形底部的地方标题中提出了一个类似的问题,即在轴下方以恒定距离显示标题?

慕桂英4014372

您可以使用画布的调整大小事件来更新bbox_to_anchor每次更新时的值。要计算新值,您可以使用轴变换 ( Bbox.inverse_transformed(ax.transAxes))的逆变换,它将以像素为单位的屏幕坐标转换为 .x 中通常使用的轴坐标bbox_to_anchor。这是一个支持将图例放在轴的所有四个边上的示例:import numpy as npfrom matplotlib import pyplot as pltfrom matplotlib.transforms import Bboxclass FixedOutsideLegend:    """A legend placed at a fixed offset (in pixels) from the axes."""    def __init__(self, ax, location, pixel_offset, **kwargs):        self._pixel_offset = pixel_offset        self.location = location        if location == 'right':            self._loc = 'center left'        elif location == 'left':            self._loc = 'center right'        elif location == 'upper':            self._loc = 'lower center'        elif location == 'lower':            self._loc = 'upper center'        else:            raise ValueError('Unknown location: {}'.format(location))        self.legend = ax.legend(            loc=self._loc, bbox_to_anchor=self._get_bbox_to_anchor(), **kwargs)        ax.figure.canvas.mpl_connect('resize_event', self.on_resize)    def on_resize(self, event):        self.legend.set_bbox_to_anchor(self._get_bbox_to_anchor())    def _get_bbox_to_anchor(self):        """        Find the lengths in axes units that correspond to the specified        pixel_offset.        """        screen_bbox = Bbox.from_bounds(            0, 0, self._pixel_offset, self._pixel_offset)        try:            ax_bbox = screen_bbox.inverse_transformed(ax.transAxes)        except np.linagl.LinAlgError:            ax_width = 0            ax_height = 0        else:            ax_width = ax_bbox.width            ax_height = ax_bbox.height        if self.location == 'right':            return (1 + ax_width, 0.5)        elif self.location == 'left':            return (-ax_width, 0.5)        elif self.location == 'upper':            return (0.5, 1 + ax_height)        elif self.location == 'lower':            return (0.5, -ax_height)x = np.arange(5)y = np.random.randn(5)fig, ax = plt.subplots(tight_layout=True)ax.plot(x, y, label='data1')ax.plot(x, y-1, label='data2')legend = FixedOutsideLegend(ax, 'lower', 20, ncol=2)plt.show()结果:
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python