matplotlib如何调整散点图尺寸适配坐标值 解决点显示过小问题
问题背景
在Raspberry Pi 3B设备上使用matplotlib绘制经纬度散点图时,由于待展示的经纬度数值跨度极小,默认生成的图表中点簇集中在极小区域,大量画布空间被空白占用。尝试在figure、axes层级调用tight_layout()、axis('scaled')方法均未达到预期效果。
原实现代码
u_lat, u_lon, u_list = [], [], [i for i in range(200)] for i in range(200): u_lat.append(random.uniform(17.160541, 17.161970)) u_lon.append(random.uniform(78.658089, 78.660843)) ############################################################## # Scatter plot of data userDataPlotFig, ax = plt.subplots() ax.scatter(u_lat, u_lon)
默认效果

原因说明
之前调用的两个方法不生效的核心原因:
tight_layout()仅负责调整子图、标签、标题的边距,不会修改坐标轴的数值范围,无法解决坐标范围适配问题axis('scaled')仅负责强制x/y轴单位长度比例一致,不会自动裁剪坐标轴上远离数据的空白区间
解决方法
手动让坐标轴范围贴合数据区间,保留少量边距避免散点贴到画布边缘即可。
- 基础适配方案
在散点绘制代码后添加坐标范围设置代码:
# 计算数据边界,预留5%的边距避免点贴边 lat_margin = (max(u_lat) - min(u_lat)) * 0.05 lon_margin = (max(u_lon) - min(u_lon)) * 0.05 # 设置x、y轴范围 ax.set_xlim(min(u_lat) - lat_margin, max(u_lat) + lat_margin) ax.set_ylim(min(u_lon) - lon_margin, max(u_lon) + lon_margin)
注意:当前代码将纬度放在x轴、经度放在y轴,不符合常规经纬度绘图习惯,建议调整为
ax.scatter(u_lon, u_lat),对应将x轴范围设置为经度区间、y轴范围设置为纬度区间即可。
- 经纬度场景优化方案(无变形)
如果需要保证经纬度比例正确不出现拉伸变形,可以在设置完坐标范围后再调用等比例方法,配合边距调整适配屏幕:
import matplotlib.pyplot as plt import random u_lat, u_lon = [], [] for i in range(200): u_lat.append(random.uniform(17.160541, 17.161970)) u_lon.append(random.uniform(78.658089, 78.660843)) # 可根据树莓派屏幕尺寸调整figsize参数,适配显示 userDataPlotFig, ax = plt.subplots(figsize=(7, 6)) # s参数可调整散点大小,提升小屏可读性 ax.scatter(u_lon, u_lat, s=12) # 计算适配数据的坐标范围 lat_min, lat_max = min(u_lat), max(u_lat) lon_min, lon_max = min(u_lon), max(u_lon) lat_pad = (lat_max - lat_min) * 0.05 lon_pad = (lon_max - lon_min) * 0.05 ax.set_xlim(lon_min - lon_pad, lon_max + lon_pad) ax.set_ylim(lat_min - lat_pad, lat_max + lat_pad) # 添加坐标轴标注 ax.set_xlabel('Longitude') ax.set_ylabel('Latitude') # 等比例显示避免经纬度形变 ax.axis('scaled') # 去除画布多余空白边距 plt.tight_layout() plt.show()
内容的提问来源于stack exchange,提问作者Akella Niranjan
相关产品推荐
相关产品推荐

