Axes3D图中通过for循环绘制散点无显示问题求助
解决3D散点图循环绘制无显示的问题
问题根源
你的数据中存在异常极大负值(例如masa第二个子列表里的-696000.0、-691500.0),同时轴范围设置时机错误,导致正常数据点被挤出可视区域,最终图表显示空白。
解决方案
- 过滤无效数据:移除不符合业务逻辑的异常值(Payload质量不可能为负,需同步删除
masa、costo、volumen中对应位置的无效数据) - 调整轴范围设置时机:将轴范围配置代码放到所有散点绘制完成之后,确保视图基于有效数据计算
修改后的代码示例
from matplotlib import pyplot as plt from mpl_toolkits.mplot3d import Axes3D # 原始数据 masa = [[700, 1150, 2000, 4000, 3600, 6000, 8500, 7800], [1065, 867, 2365, -696000.0, 3317, 6365, -691500.0, 7517]] volumen = [[0.4, 1.0, 2.0, 2.0, 2.0, 3.0, 5.0, 4.0], [0.25913, 0.815087, 1.85913, 1.3, 1.8150870000000001, 2.85913, 4.3, 3.815087]] costo = [[33600000000, 31248000000, 139200000000, 136442100000, 198360000000, 424800000000, 405712320000, 594720000000], [41238120000, 35532000000, 155021820000, 161632080000, 207234000000, 456989220000, 456960900000, 612774000000]] # 过滤无效数据:移除masa为负的点,同步删除对应costo和volumen的元素 filtered_masa = [] filtered_costo = [] filtered_volumen = [] for m_list, c_list, v_list in zip(masa, costo, volumen): valid_indices = [i for i, m in enumerate(m_list) if m >= 0] filtered_masa.append([m_list[i] for i in valid_indices]) filtered_costo.append([c_list[i] for i in valid_indices]) filtered_volumen.append([v_list[i] for i in valid_indices]) fig = plt.figure(2) ax = fig.add_subplot(111, projection='3d') ax.set_ylabel('Masa Disponible para Payload (g)') ax.set_zlabel('Volumen Disponible para Payload (U)') ax.set_xlabel('Costo $USD') ax.view_init(20, -120) # 循环绘制过滤后的有效散点 for count in range(len(filtered_masa)): ax.scatter(filtered_costo[count], filtered_masa[count], filtered_volumen[count]) # 绘制完成后再设置轴范围 ax.set_ylim3d(bottom=0, top=12000) ax.set_xlim3d(left=0) ax.set_zlim3d(bottom=0, top=6) plt.show()
说明
- 异常值会导致matplotlib自动计算视图范围时,把正常数据点压缩到几乎不可见的区域,即使手动设置轴范围,提前设置也可能被后续绘制的异常点干扰。
- 过滤无效数据后再绘制,结合后置的轴范围设置,就能确保所有有效散点都显示在可视区域内。
内容的提问来源于stack exchange,提问作者Nico Sepulveda
相关产品推荐
相关产品推荐

