Matplotlib 3D线框图未按预期绘制

2 投票
1 回答
596 浏览
提问于 2025-04-18 17:42

我正在进行一个有两个变量的模拟:P和Q。

P和Q的取值范围都是[0.2, 0.4, 0.6, 0.8]。

每一种P和Q的组合都会产生一个输出,我称之为NB_Means。 NB_Means是通过将P设置为0.2,然后让Q在[0.2, 0.4, 0.6, 0.8]之间变化来生成的,之后我会把P改为0.4,重复这个过程。

举个例子,在NB_Means中:当p=0.2且q=0.2时,结果是32;当p=0.2且q=0.4时,结果是159,依此类推。

我想要绘制一个这样的线框图:

from mpl_toolkits.mplot3d import Axes3D
from matplotlib import cm
from matplotlib.ticker import LinearLocator, FormatStrFormatter
import matplotlib.pyplot as plt
import numpy as np


x=[.2,.2,.2,.2,.4,.4,.4,.4,.6,.6,.6,.6,.8,.8,.8,.8]
y=[.2,.4,.6,.8,.2,.4,.6,.8,.2,.4,.6,.8,.2,.4,.6,.8]
nb_means = [32, 159, 216, 327, 206, 282, 295, 225, 308, 252, 226, 229, 301, 276, 262, 273]

fig = plt.figure()
ax = plt.axes(projection='3d')
X,Y = np.meshgrid(x,y)

ax.set_title('Name Based Routing')
ax.set_xlabel('Prob of Request')
ax.set_ylabel('Prob of Publish')
ax.set_zlabel('RTT')
ax.plot_wireframe(X, Y, nb_means, rstride=10, cstride=10)
plt.show()

matplotlib output

但是,正如你在上面的输出中看到的……我原本期待线框图在Q轴上是逐渐增加的,但实际上并不是这样。

我是在设置x轴和y轴的时候出错了吗?

1 个回答

3

XYnb_means 都是问题所在。它们应该都是二维数组(而你的 nb_means 现在是一个一维列表)。而且,你也不需要用 meshgrid 来创建 XY,你只需要把它们重新调整形状就可以了:

X = np.reshape(x, (4,4))
Y = np.reshape(y, (4,4))
nb2 = np.reshape(nb_means, (4,4))
...
ax.plot_wireframe(X, Y, nb2)

另外,你可能也不太需要设置 rstride=10 和 cstride=10。

撰写回答