好的,我正在尝试绘制matplotlib 3d表面图。
import pandas as pd
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
import itertools as it
import numpy as np
plt.clf()
fig = plt.figure(figsize=(6.27, 9.69))
ax = Axes3D(fig)
x = list(range(1,101,11))
y = list(range(1,101,11))
df = pd.DataFrame(columns=y, index=x)
iterator = it.product(x,y)
for i in iterator:
number = np.random.rand()
df.loc[i[0],i[1]] = number
surf = ax.plot_surface(df.index,
df.columns,
df,
cmap='viridis_r',
linewidth=0.5,
alpha = 0.5,
edgecolor = 'k')
ax.set_xlim3d(0,101)
ax.set_ylim3d(0,101)
ax.invert_yaxis()
cb = fig.colorbar(surf, shrink=0.8 , alpha = 0.5)
cb.solids.set_edgecolor("face")
plt.show()
我的代码可以工作(遵循某种方式),但是我的所有结果仅出现在x=y
的直线上,即二维图形。
我曾认为这可能与使用itertools有关(代码未遍历所有迭代循环),但数据框似乎还不错。
有人可以告诉我我在做什么错吗?
答案 0 :(得分:1)
我检查了一下,在绘制之前确实需要计算一个网格。您可以只添加以下内容:
...
for i in iterator:
number = np.random.rand()
df.loc[i[0],i[1]] = number
xv, yv = np.meshgrid(df.index, df.columns)
surf = ax.plot_surface(xv,
yv,
df,
cmap='viridis_r',
linewidth=0.5,
alpha = 0.5,
edgecolor = 'k')
...
我真的不知道这是否是预期的结果,但是您可以获得真实的表面!
meshgrid
只是创建与x和y的值的不同排列相对应的矩阵,以使您可以为一个y使用不同的x,反之亦然。