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
相关产品推荐
相关产品推荐

