matplotlib bar3d绘图位置偏移及形状不符问题咨询
解决matplotlib bar3d的精度与柱子形状问题
我来帮你排查下这两个bar3d的常见问题,咱们一步步来解决:
1. 让(0,0)数据点精确对应坐标原点
首先要明确bar3d的核心参数逻辑:x和y是柱状图左下角的坐标,而非中心坐标。针对你的需求,分两种情况处理:
- 如果要让(0,0)数据点的柱子左下角严格对齐原点:确保你调用
bar3d时传入的x、y值就是0,比如对{x:0., y:0., occurence:676}这个点,直接写ax.bar3d(0, 0, 0, 0.1, 0.1, 676)即可。同时要避免坐标轴自动缩放把原点挤出可视范围,手动设置坐标轴范围确保原点被包含:ax.set_xlim(min_x - dx, max_x + dx) # min_x是所有x数据的最小值,max_x是最大值 ax.set_ylim(min_y - dy, max_y + dy) - 如果要让柱子中心对齐原点:需要把x和y调整为
0 - dx/2和0 - dy/2(也就是-0.05),这样柱子的中心刚好落在(0,0)位置。
2. 让dx=0.1、dy=0.1的柱状图呈方形
这个问题几乎都是3D坐标轴比例不一致导致的视觉错觉——虽然dx和dy数值相等,但x轴和y轴的缩放比例不同,看起来就不是方形。解决方法很直接:
- 用
set_box_aspect设置三个坐标轴的比例(matplotlib 3.3及以上版本支持):ax.set_box_aspect([1, 1, 0.5]) # [x轴比例, y轴比例, z轴比例],这里x和y设为1:1,z轴可按需调整 - 如果是旧版本matplotlib,可以用
ax.set_aspect('equal'),不过3D场景下set_box_aspect的效果更稳定。
另外也可以旋转3D视角确认是不是视觉角度的问题,但大部分情况下调整坐标轴比例就能解决。
完整示例代码
结合你的数据,这里给一个可直接运行的示例:
import matplotlib.pyplot as plt # 你的数据 data_points = [ {"x": -3.6, "y": -0.019, "occurence": 676}, {"x": -3.10, "y": -0.0999, "occurence": 676}, {"x": -1.9, "y": -0.0999, "occurence": 676}, {"x": -0.07, "y": 0., "occurence": 676}, {"x": 0., "y": 0., "occurence": 676} ] fig = plt.figure(figsize=(10, 8)) ax = fig.add_subplot(projection='3d') dx = 0.1 dy = 0.1 # 绘制所有柱状图 for point in data_points: # 如果你要让(0,0)柱子的左下角在原点,直接用point["x"]和point["y"] # 如果要中心在原点,改成point["x"] - dx/2 和 point["y"] - dy/2 ax.bar3d(point["x"], point["y"], 0, dx, dy, point["occurence"]) # 确保坐标轴包含原点 all_x = [p["x"] for p in data_points] all_y = [p["y"] for p in data_points] ax.set_xlim(min(all_x) - dx, max(all_x) + dx) ax.set_ylim(min(all_y) - dy, max(all_y) + dy) ax.set_zlim(0, max(p["occurence"] for p in data_points) + 100) # 设置x/y轴比例相等,让柱子呈方形 ax.set_box_aspect([1, 1, 0.5]) plt.title("Bar3d Fixed Precision & Shape") plt.show()
内容的提问来源于stack exchange,提问作者infoclogged
相关产品推荐
相关产品推荐

