matplotlib 3d曲面显示不正确的x和y数据

时间:2018-07-05 14:03:47

标签: python pandas matplotlib

好的,我正在尝试绘制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的直线上,即二维图形。

enter image description here

我曾认为这可能与使用itertools有关(代码未遍历所有迭代循环),但数据框似乎还不错。

有人可以告诉我我在做什么错吗?

1 个答案:

答案 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,反之亦然。