You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Matplotlib中如何将多个蓝色LoS图例合并为一个并调整位置?

问题

绘图测试中生成的图表存在多个标注为“LoS”的蓝色图例,需合并为一个(与红色Bresenham's图例形式一致),同时调整图例位置,避免其处于图表中间区域。相关代码如下:

Main

import lineofsights as los
import LineOfSight as bren
import matplotlib.pyplot as plt
import numpy as np

drone_height = 60
risk = [x for x in range(50,60)]
elevation = [[0 for x in range(10)] for y in range(20)]

x1, y1 = 0,0
x2, y2 = 1,9
print("result from lineofsights:")
los.lineOfsight(elevation, risk, drone_height, y1, x1, y2, x2)

print("\n\n")

print("result from bresenham")
bren.get_line((x1,y1), (x2,y2), elevation, drone_height, risk)


xx = [x for x in range(len(elevation[0]))]
yy = [y for y in range(len(elevation))]

xx,yy = np.meshgrid(xx,yy)

plt.plot(xx,yy,"sb",markersize=17,label="LoS")

a = len(elevation)-1

plt.plot([y1, y2],[a-x1, a-x2], "-r",label="Bresenham's")

plt.xlabel('X')
plt.ylabel('Y')
plt.legend()
plt.show()
解决方案

1. 合并多个“LoS”图例

原代码用plt.plot(xx, yy, "sb", label="LoS")时,meshgrid生成的xx和yy是二维数组,plot会把每一行数据当成独立曲线,因此生成多个同名图例。改用plt.scatter可一次性绘制所有点,仅生成一个图例项:

plt.scatter(xx, yy, s=17**2, c='blue', marker='s', label="LoS")

注:scatter的s参数是点面积,对应plot中markersize的平方,设为17**2保证点大小一致。

2. 调整图例位置

在plt.legend()中通过loc参数指定位置,避开图表中间区域,示例:

plt.legend(loc='upper right')

也可用bbox_to_anchor实现更灵活的位置控制(比如放在图表外部):

plt.legend(loc='upper left', bbox_to_anchor=(1, 1))

修改后的完整代码

import lineofsights as los
import LineOfSight as bren
import matplotlib.pyplot as plt
import numpy as np

drone_height = 60
risk = [x for x in range(50,60)]
elevation = [[0 for x in range(10)] for y in range(20)]

x1, y1 = 0,0
x2, y2 = 1,9
print("result from lineofsights:")
los.lineOfsight(elevation, risk, drone_height, y1, x1, y2, x2)

print("\n\n")

print("result from bresenham")
bren.get_line((x1,y1), (x2,y2), elevation, drone_height, risk)


xx = [x for x in range(len(elevation[0]))]
yy = [y for y in range(len(elevation))]

xx,yy = np.meshgrid(xx,yy)

# 改用scatter绘制所有点,仅生成一个LoS图例
plt.scatter(xx, yy, s=17**2, c='blue', marker='s', label="LoS")

a = len(elevation)-1

plt.plot([y1, y2],[a-x1, a-x2], "-r",label="Bresenham's")

plt.xlabel('X')
plt.ylabel('Y')
# 指定图例位置为右上角
plt.legend(loc='upper right')
plt.show()

内容的提问来源于stack exchange,提问作者SH_IQ

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.18 00:15:43