matplotlib中矩形阵列的曲面图

时间:2018-09-23 02:21:06

标签: python python-3.x numpy matplotlib mplot3d

我正在尝试使用matplotlib生成矩形阵列的表面图(在我的情况下为47x70)。该数组的组织方式为:

47-此尺寸表示特征数量

70-此维表示样本数

该数组包含每个样本中这些功能的值。

如果要在MATLAB或Octave中生成表面图,那真的很简单。

vals = csvread("vals.csv"); surf(vals)

输出看起来像这样-

Surface plot of a 47x70 array generated using numpy.random.randint

vals.csv中的数组生成如下-

tempvals = np.random.randint(0, 10000, size = (47, 70))
np.savetxt("vals.csv", tempvals, delimiter=',')

如何在python / matplotlib中做到这一点?

There is a pretty nice answer here。但是,此答案使用了一些我无法使用的插值法。我想直接绘制我的值。

我试图写一些非常基础的东西。像这样-

import numpy as np
from mpl_toolkits.mplot3d import Axes3D
import matplotlib.pyplot as plt

vals = np.genfromtxt('vals.csv', delimiter=',')

fig1 = plt.figure(1, figsize = (9, 6))
ax1 = fig1.add_subplot(111, projection = '3d')
xax = np.arange(0, 46)
yax = np.arange(0, 70)
xax, yax = np.meshgrid(yax, xax)

Axes3D.plot3D(xax, yax, vals)

这当然会失败,并显示以下错误-

AttributeError: 'numpy.ndarray' object has no attribute 'has_data'

我经历了this entire page,但是我缺少一些东西。如何生成矩形阵列的表面图?

1 个答案:

答案 0 :(得分:1)

我认为这会产生与您链接到matplotlib - 3d surface from a rectangular array of heightssurf(vals) matlab图相似的结果。

import numpy as np
from mpl_toolkits.mplot3d import Axes3D
import matplotlib.pyplot as plt

# gen random 2d array and write to csv file
tempvals = np.random.randint(0, 10000, size = (47, 70))
np.savetxt("vals.csv", tempvals, delimiter=',')

# read from csv
vals = np.genfromtxt('vals.csv', delimiter=',')
val_xdim, val_ydim = vals.shape

# generate meshgrid for plot
xax = np.arange(0, val_xdim)
yax = np.arange(0, val_ydim)
xax, yax = np.meshgrid(yax, xax)

# plot and save
fig = plt.figure()
ax = fig.gca(projection='3d')
surf = ax.plot_surface(xax, yax, vals, rstride=1, cstride=1, cmap='viridis', linewidth=0, antialiased=False)
ax.plot_wireframe(xax, yax, vals, color='k', lw=0.05, alpha=0.3)
fig.colorbar(surf, shrink=0.5, aspect=5)
plt.savefig("rand_3d_surf.png", dpi=160)

哪个生产: Example 3d surface plot