使用matplotlib从“列表的列表”绘制三维曲面

6

我已经搜索了一段时间,虽然我可以找到许多有用的meshgrid示例,但没有一个清晰地展示如何将我的列表数据转换为适用于任何已提到的各种方式的格式。

当涉及到numpy/matplotlib时,我有点迷茫,不懂术语和步骤顺序。

我发现最接近的是在matplotlib中从元组列表绘制三维曲面

我有一个高度数据的列表。

data=[[h1,h2,h3,h...],
     [h,h,h,h],
     [h,h,h,h],
     [h,h,h,h16]]

data[0][1]==h2

data[4][4]==h16

我该如何使用matplotlib/numpy等工具绘制这些值的简单3D表面图呢?就像一个颜色映射,将颜色值作为z值。我可以使用imshow()函数,因为它可以直接处理列表嵌套列表的数据格式。但是我不确定需要将我的数据切片成什么样子才能用plot_surface()函数来绘制。


这些列表长度是否相同,即它们是否可以直接与2D numpy数组兼容? - MaxNoe
是的,它们代表一个正方形网格。我看很容易从它们构建一个2D numpy数组,但我不确定接下来该怎么做? - Matt Warren
我应该如何将我的数据数组(data_array=array(data))转换为plot_surface所需的X、Y、Z格式?这就是我目前感到困惑的地方。 - Matt Warren
看看我的答案 ;) - MaxNoe
1个回答

4

如果您想要一个3D表面,则必须生成x和y坐标。如果您不在意它们是什么,只想要表面,请在给定长度内生成一个整数的网格:

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


data = np.array(data)
length = data.shape[0]
width = data.shape[1]
x, y = np.meshgrid(np.arange(length), np.arange(width))

fig = plt.figure()
ax = fig.add_subplot(1,1,1, projection='3d')
ax.plot_surface(x, y, data)
plt.show()

请参考http://matplotlib.org/mpl_toolkits/mplot3d/tutorial.htmlhttp://nbviewer.ipython.org/github/jrjohansson/scientific-python-lectures/blob/master/Lecture-4-Matplotlib.ipynb获取更多信息。


谢谢。这正是我想要的,也是我所需要的一切。我很快会认真阅读链接的内容 ;) - Matt Warren

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接