当前位置: 首页 > 知识库问答 >
问题:

在matplotlib中,bbox_to_anchor的4元素元组参数是什么意思?

龙高歌
2023-03-14

在matplotlib网站“图例指南”的“图例位置”部分,有一个小脚本,其中第9行是plt。图例(bbox_至_锚=(0,1.02,1.,.102),loc=3,ncol=2,mode=“expand”,borderaxespad=0。) 。我看到传递给bbox\u to\u anchor的所有元组中都有2个元素,但这一个有4个。如果传递的元组有4个元素,那么每个元素意味着什么

我在pyplot中查看它。图例docs,上面说了一些关于坐标的内容。所以我环顾四周,找到了matplotlib。转变。Bbox带有一个静态范围(x0,y0,宽度,高度)

我猜4元组参数的设置是基于这个的。我将脚本复制到Spyder,在Ipython控制台中执行了%matplotlib,并更改了一些值。这似乎是有道理的,但当我尝试将.102更改为类似0.9的内容时,图例没有改变。我认为元组是基于来自_bounds的,我只是不知道为什么更改元组中的最后一个值没有任何作用。


共有2个答案

余弘新
2023-03-14

@重要的是,贝因杰内斯特的回答非常好。我想进一步阐述图例框和边界框之间对齐的含义。这意味着图例框和边界框的参数loc指示的不同位置将放在同一点上。

例如,如果loc='center',图例框的中心和边界框将位于同一点。如果loc='center right',则图例框和边界框的右中心将位于同一点上。抱歉说得太多了。。。

让我们举出一个具体的例子来说明这个想法,

import matplotlib.pyplot as plt
import numpy as np
import matplotlib.patches as patches

locs = ['upper right', 'lower left', 'center left', 'lower center', 'center',
        'right']

x0, y0, width, height = 0.5, 0.5, 0.1, 0.4

x = np.arange(0.1, 4, 0.1)
y = 1.0/x

fig = plt.figure(figsize=(10, 10))

idx = 1
for i in range(0, 2):
    for j in range(0, 3):
        ax = fig.add_subplot(3, 2, idx)
        ax.plot(x, y, label=r'$\frac{1}{x}$')
        ax.legend(loc=locs[idx-1], bbox_to_anchor=(x0, y0, width, height),
            edgecolor='g', fontsize='large', framealpha=0.5,
            borderaxespad=0)
        ax.add_patch(
            patches.Rectangle((x0, y0), width, height, color='r',
                            fill=False, transform=ax.transAxes)
        )
        ax.text(0.6, 0.2, s="loc = '{}'".format(locs[idx-1]),
        transform=ax.transAxes)
        idx += 1

plt.show()

在图像中,红色框是边界框,绿色框是图例框。每个子图中的loc表示两个框之间的对齐关系。

当只有两个值给bbox_to_anchor时,边界框宽度和高度设置为零。让我们稍微修改一下上面的代码,

import matplotlib.pyplot as plt
import numpy as np
import matplotlib.patches as patches

locs = ['upper right', 'lower left', 'center left', 'lower center', 'center',
        'right']

x0, y0, width, height = 0.5, 0.5, 0, 0

x = np.arange(0.1, 4, 0.1)
y = 1.0/x

fig = plt.figure(figsize=(10, 10))

idx = 1
for i in range(0, 2):
    for j in range(0, 3):
        ax = fig.add_subplot(3, 2, idx)
        ax.plot(x, y, label=r'$\frac{1}{x}$')
        ax.legend(loc=locs[idx-1], bbox_to_anchor=(x0, y0, width, height),
            edgecolor='g', fontsize='large', framealpha=0.5,
            borderaxespad=0)
        ax.add_patch(
            patches.Rectangle((x0, y0), width, height, color='r',
                            fill=False, transform=ax.transAxes)
        )
        ax.text(0.6, 0.2, s="loc = '{}'".format(locs[idx-1]),
        transform=ax.transAxes)
        ax.plot(x0, y0, 'r.', markersize=8, transform=ax.transAxes)
        idx += 1

plt.show()

现在,生成图像变为

上图中的红点表示绑定框坐标位置。

姬振濂
2023-03-14

没错,plt中的4元组。图例(bbox_至_锚=(0,1.02,1,0.102),loc=3)设置为(x0,y0,宽度,高度),其中(x0,y0)是边界框的左下角坐标。

当这些参数为图例设置边界框时,图例的实际垂直大小将缩小到放入元素所需的大小。另外它的位置仅结合loc参数来确定。loc参数设置边界框内图例的对齐方式,这样在某些情况下,当更改高度时,就不会看到任何差异,例如图(2)和(4)。

 类似资料:
  • 我必须编写一个名为productOfPrevious的方法,它接受一个整数数组,并返回一个与输入大小相同的整数数组。返回数组中的每个单元格都是该单元格与前面所有单元格的乘积。 这是我的密码。但我不知道为什么输出数组中的元素总是为零。 输入:{1,2,3,4,5} 我需要的输出:{1,2,6,24,120} 我获得的输出:{0,0,0,0,0} 我的代码有什么问题吗?

  • 问题内容: 我有一个看起来像元组的列表: 检查该元组中是否存在值的最佳方法是什么?例如,我想能够说: 并得到真 问题答案: 您正在寻找: 结合一个简单的生成器表达式,就可以完成任务。生成器表达式接受每个元组,如果包含则产生。然后在请求的第一个项目返回时返回(否则为)。因此,这就是您想要的。它也可以很好地读取- 如果有任何元组包含。 如果您要执行大量操作并且需要性能,那么可能值得设置所有值的集合以使

  • 问题内容: 谁能解释为什么在Python中将单个元素元组解释为该元素? 和 他们为什么不只是将元组打印为? 请参阅以下示例: 问题答案: 单个元素元组永远不会被视为包含的元素。括号对分组最有用,而不是对元组的创建。逗号会这样做。 他们为什么不只将(1,)打印为(1)? 可能是因为打印内置容器类型提供了一种表示形式,可用于通过表示重新创建容器对象,例如: 的docs在此方面提供了一些清晰度: 如果可

  • 本文向大家介绍在JSP的操作元素中,id和scope属性是什么意思?,包括了在JSP的操作元素中,id和scope属性是什么意思?的使用技巧和注意事项,需要的朋友参考一下 这是所有Action元素共有的两个属性:id属性和scope属性。 ID属性 id属性唯一地标识Action元素,并允许在JSP页面内引用该操作。如果Action创建了对象的实例,则ID值可用于通过隐式对象PageContext

  • 我是javascript的新手。我曾经读过关于SAEF的文章,但我仍然有疑问,代码如下: