我想绘制一个 3D 曲面。数据在 mathematica 中生成,并导出到一个文件中,其中三列用空格分隔(我可以将其切换为逗号或其他分隔符)。我遇到的问题是,到目前为止,我一直在使用 gnuplot 绘制所有 2D 图,但对于这个特定的图,gnuplot 并不是那么容易使用,而且结果也不是很好。
我读过关于 matplotlib 的文章,但我发现文档很难读懂。当我开始使用 gnuplot 时,我发现了一个非常好的模板,这里我可以以任何我喜欢的方式使用它来生成二维图和多重图。
有没有类似 matplotlib 的东西可以使用?几乎所有 matplotlib 示例都涉及以各种方式绘制的函数,但没有任何导入数据并绘制数据的示例。
答案1
我想你在这里问了几个问题,我会尝试回答最基本的问题:将你的 CSV 数据加载到 Python 中,然后绘制一个基本的曲面图。
请注意,在一般情况下对于绘图,您需要一个 NxN 的 Z 值矩阵,其中 X 和 Y 是长度为 N 的向量。这是有道理的,因为每个 (x, y) 点都需要一个 Z 值,并且有 N x N 个 (x, y) 点。我将向您展示两种方法。一旦您掌握了这些方法,那么至少您就可以开始使用文档和网络上的其他示例自定义您的绘图了。
这个答案假设你正在使用Python 3以及最新版本的Matplotlib 和 Numpy(Numpy 是一个数值 Python 包,通常包含在 Python 发行版中,例如 Anaconda。)但是,在旧版本中语法应该不会有太大差异。
首先,进行必要的导入:
import numpy as np
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
当您有 3 列 1d 数据 --- x、y 和 z 的情况时:
DataAll1D = np.loadtxt("datacsv_1d.csv", delimiter=",")
# create 2d x,y grid (both X and Y will be 2d)
X, Y = np.meshgrid(DataAll1D[:,0], DataAll1D[:,1])
# repeat Z to make it a 2d grid
Z = np.tile(DataAll1D[:,2], (len(DataAll1D[:,2]), 1))
fig = plt.figure()
ax = fig.add_subplot(111, projection='3d')
ax.plot_surface(X, Y, Z, cmap='ocean')
plt.show()
请注意,在 np.loadtxt 中您可以设置任何分隔符,例如“ ”表示空格。
当您有 2 列 1d 数据 --- x 和 y --- 以及 2d z 数据矩阵的情况:
DataX_Y_1D = np.loadtxt("datacsv_1d_xy.csv", delimiter=",")
# create 2d x,y grid (both X and Y will be 2d)
X, Y = np.meshgrid(DataX_Y_1D[:,0], DataX_Y_1D[:,1])
# get 2D z data
Z = np.loadtxt("datacsv_2d_Z.csv", delimiter=",")
fig = plt.figure()
ax = fig.add_subplot(111, projection='3d')
ax.plot_surface(X, Y, Z, cmap='ocean')
plt.show()
要进行更高级的定制,请参见以下有关该主题的另一个很好的教程的链接:
https://jakevdp.github.io/PythonDataScienceHandbook/04.12-three-Dimensional-plotting.html
编辑:如果您有 3 列(X、Y、Z)中涵盖的所有必要数据点,那么这plot_trisurf
就是您所需要的。请参阅我在 Stack Overflow 上的回答,了解一个简单的示例:https://stackoverflow.com/questions/39240327/3d-surface-plot-using-matplotlib-in-python/52630484#52630484