python中legend横向_matplotlib 到底该如何控制legend的位置之一?

本文探讨了在matplotlib 3.1.0版本中如何使用loc参数控制图例(legend)的位置。loc参数有两种类型:str类型对应9个预设位置,如'upper left';元组类型允许自定义legend左下角坐标,实现更精确的位置控制。通过示例代码展示了不同loc设置下的legend位置效果。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

matplotlib版本号:3.1.0

import matplotlib

import matplotlib.pyplot as plt

import matplotlib.patches as mpatches

print(matplotlib.__version__) # 3.1.0

在使用matplotlib做图时,总免不了和图例(legend)打交道,那图例到底该放在哪?如何放到指定的位置?(本文只讨论legend的坐标系为axes的情况)

关于如何控制legend的位置,官网介绍了2个参数:loc 与bbox_to_anchor。

本篇文章看看loc如何控制legend的位置的,通过官网文档可以很容易得知loc参数有2种类型:str类型,为我们准备了9种位置(可参考图1),示例:loc = 'upper left'

首先legend是一个bbox类型,是一个由4条边框围成的区域,轴域(axes)也是由4条边框围成的区域(x, y 轴,上边缘线,右边缘线),当loc为str类型时,表示 legend中str所代表的位置与轴域(axes)中str所代表的位置重合。

['upper left' , 'upper center', 'upper right',

'center left', 'center', 'center right',

'lower left', 'lower center', 'lower right']

语法如下:

.legend(loc='center') # 通过设置loc = 'one of nine locations'即可

上图完整代码如下:

import matplotlib

import matplotlib.pyplot as plt

import matplotlib.patches as mpatches

upper_left = mpatches.Patch(color='red', label='upper left')

upper_right = mpatches.Patch(color='blue', label='upper right')

lower_right = mpatches.Patch(color='purple', label='lower right')

lower_left = mpatches.Patch(color='yellow', label='lower left')

center_left = mpatches.Patch(color='green', label='center left')

center_right = mpatches.Patch(color='gray', label='center right')

lower_center = mpatches.Patch(color='black', label='lower center')

upper_center = mpatches.Patch(color='green', label='upper center')

center = mpatches.Patch(color='purple', label='center')

patches = [upper_left, upper_right, lower_left, lower_right, center_left, center_right, lower_center,

upper_center,center]

location = ['upper left', 'upper right', 'lower left', 'lower right', 'center left', 'center right',

'lower center', 'upper center', 'center']

lst = []

fig, ax = plt.subplots(figsize=(16, 9))

for patch, loc in zip(patches, location):

lst.append(ax.legend(handles=[patch], loc=loc, fontsize=18))

for i in range(len(patches)):

plt.gca().add_artist(lst[i])

ax.annotate('borderaxespad', xy=(0.1, 0.99), xytext=(0.2, 0.8), fontsize=18,

arrowprops={'arrowstyle':'->'})

ax.annotate('', xy=(0.001, 0.5), xytext=(0.25, 0.8), fontsize=18,arrowprops={'arrowstyle':'->'})

ax.set_title('loc-str类型参数图示', fontsize=18, fontweight='bold')

ax.tick_params(labelsize=14)

# 至于那些缝隙,可以通过设置borderaxespad=0消除一对浮点数(x,y),保存在元组中. 示例:loc = (0, 0)

(x, y):此种形式是将legend的左下角放置在点(x, y)上,可参考下图:

左图中红点坐标分别为(2,2), (7,8) , (11,7) , (14,5)

通过左右两张图比较,很容易看出,右图中legend的左下角与点(x, y)重合。

注意:当使用loc=(x,y)时,x, y并不是轴域中实际的x, y的值,而是将x轴, y轴分别看成1, 即:(x/(x_max-x_min), y/(y_max-y_min))(归1处理);

在绘制上图时,其中xlim=(0, 16), ylim=(0, 9),所以如果将legend放置到点(2, 2)上,那loc实际要写成:

.legend(loc=(2/16, 2/9))

上图的完整的代码如下:

import matplotlib

import matplotlib.pyplot as plt

import matplotlib.patches as mpatches

fig, axes= plt.subplots(1,2, figsize=(16, 4))

axes[0].set_xlim(0, 16)

axes[0].set_ylim(0, 9)

axes[1].set_xlim(0, 16)

axes[1].set_ylim(0, 9)

axes[0].grid()

axes[1].grid()

# 接下来利用(x, y)将legend分别放在图中(2,2) , (7,8), (11, 7), (14, 3)

axes[0].scatter(x=[2, 7, 11, 14, 16.5], y=[2, 8, 7, 3, 9], color='red', marker='*')

#

patch1 = mpatches.Patch(color='red', label='2,2')

patch2 = mpatches.Patch(color='red', label='7,8')

patch3 = mpatches.Patch(color='red', label='11,7')

patch4 = mpatches.Patch(color='red', label='14,3')

patch5 = mpatches.Patch(color='red', label='16.5, 9')

patches = [patch1, patch2, patch3, patch4, patch5]

# 可以看到设置x,y值时,分别进行了归1的处理

location = [(2/16,2/9), (7/16,8/9), (11/16,7/9), (14/16,3/9), (16.5/16, 9/9)]

#

lst = []

for pathc, loc in zip(patches, location):

lst.append(axes[1].legend(handles=[pathc], loc=loc))

#

for i in range(len(patches)):

axes[1].add_artist(lst[i])

#

fig.suptitle('loc_元组类型参数图示', fontweight='bold', fontsize=18)

axes[1].tick_params(labelsize=13)

axes[0].tick_params(labelsize=13)

总结一下,loc参数比较简单,提供了2种控制legend位置的格式

1)9个固定的位置(图1),loc=str,是设置legend的'str'位置与轴域(axes)的'str'位置重合

2)通过给定legend左下角的坐标,设置legend的位置(图2),无论是图内还是图外,只要小心设置,终将会把legend放到你想放的位置。

下篇文章将会介绍bbox_to_anchor,比较有意思的是bbox_to_anchor,其中weight,height又代表什么意思?和loc又会擦出怎样的火花?

水平有限,若有错误,欢迎指正,欢迎交流

参考:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值