如何修复Matplotlib 3D绘图中(x,y,z)坐标投影至xy平面的对齐问题
如何修复Matplotlib 3D绘图中(x,y,z)坐标投影至xy平面的对齐问题
看起来你遇到的问题是手动绘制的竖线没和xy平面的整数坐标对齐,其实这个问题有两种解决思路,其中一种还能让你的代码更简洁:
方法一:用Matplotlib内置的stem函数替代手动画线
你现在手动遍历每个点画竖线的逻辑本身没错,但可能因为3D绘图的坐标变换、浮点数精度或者轴的显示设置,导致视觉上出现不对齐的情况。而stem函数是专门为这类「从基底平面(这里是z=0的xy平面)向上绘制到数据点」的场景设计的,能自动处理坐标对齐问题。
把原来的散点绘制和手动画线代码替换成下面这行即可:
ax.stem(X, Y, Z, linefmt='r-', markerfmt='o', basefmt=' ')
linefmt='r-':设置竖线为红色实线markerfmt='o':保持数据点为圆形标记basefmt=' ':隐藏基底平面的默认横线,避免干扰视觉
方法二:调整轴范围优化对齐效果
如果你还是想保留手动绘制竖线的方式,可以给x、y轴设置一个稍微宽一点的范围,让整数刻度正好落在单元格的中心位置,视觉上就能完美对齐了:
ax.set_xlim(-0.5, 3.5) ax.set_ylim(-0.5, 2.5)
修改后的完整代码示例
import math import numpy as np import matplotlib.pyplot as plt def f(x, y): if(1 <= x + y and x + y <= 4): return (math.comb(3, x) * math.comb(2, y) * math.comb(3, 4 - x - y)) / math.comb(8, 4) else: return 0.0 x_domain = np.array([0, 1, 2, 3]) y_domain = np.array([0, 1, 2]) X, Y = np.meshgrid(x_domain, y_domain) X = np.ravel(X) Y = np.ravel(Y) Z = np.zeros_like(X, dtype=float) for i in range(len(X)): Z[i] = f(X[i], Y[i]) fig = plt.figure(figsize=(8, 4)) ax = fig.add_subplot(1, 1, 1, projection="3d") # 使用stem函数替代手动绘制 ax.stem(X, Y, Z, linefmt='r-', markerfmt='o', basefmt=' ') ax.set_xticks(x_domain) ax.set_yticks(y_domain) # 可选:调整轴范围让刻度更居中 ax.set_xlim(-0.5, 3.5) ax.set_ylim(-0.5, 2.5) plt.show()
这样修改后,红色竖线就能完全和xy平面的整数坐标对齐啦。
备注:内容来源于stack exchange,提问作者a_floating_point
相关产品推荐
相关产品推荐

