在matplotlib中从(x, y, z)数据集绘制等值线/轮廓线

3

你好,我刚开始学编程,尝试做一些可能很明显但我却想不出来的事情。我有一系列的x、y、z数据(在我的情况下,对应距离、深度和pH值)。我想使用matplotlib在xy(距离、深度)网格上绘制z数据(pH值)的等值线图。是否有任何方法可以实现?谢谢。

1个回答

3

解决方案将取决于数据的组织方式。

常规网格数据

如果xy数据已经定义了一个网格,它们可以很容易地被重新整形成四边形网格。例如:

#x  y  z
 4  1  3
 6  1  8
 8  1 -9
 4  2 10
 6  2 -1
 8  2 -8
 4  3  8
 6  3 -9
 8  3  0
 4  4 -1
 6  4 -8
 8  4  8 

可以使用contour来绘制图形。

import matplotlib.pyplot as plt
import numpy as np
x,y,z = np.loadtxt("data.txt", unpack=True)
plt.contour(x.reshape(4,3), y.reshape(4,3), z.reshape(4,3))

任意数据

(a) 如果数据不是在四边形网格上,可以将其插值到网格上。其中一种方法由matplotlib提供,使用matplotlib.mlab.griddata

import matplotlib.mlab
xi = np.linspace(4, 8, 10)
yi = np.linspace(1, 4, 10)
zi = matplotlib.mlab.griddata(x, y, z, xi, yi, interp='linear')
plt.contour(xi, yi, zi)

(b) 最后,可以完全不使用四边形网格绘制等高线。这可以使用tricontour来实现。

plt.tricontour(x,y,z)

一个比较后两种方法的例子可以在matplotlib页面找到。

谢谢!我也找到了一种在matlab中实现它的方法(虽然不是我的首选,但我很绝望),使用这里的tricontour:链接 斜体 粗体 代码 - Hg1
dataset = xlsread('dataset.xlsx','Sheet2','B1:D10'); #每个新的'#'是Matlab中的新行,因为我无法使此注释格式化# #x = dataset(:,1);
#y = dataset(:,2); #z = dataset(:,3); #[xx,yy]=meshgrid(x,y); #zz=griddata(x,y,z,xx,yy); %将z散点数据与xy网格相关联 #v=3:0.5:7; %等高线级别:最低:步长间隔:最高#idx=randperm(numel(zz));
#n=idx(1:ceil(numel(zz)/2))'; #x=xx(n);
#y=yy(n);
#z=zz(n); #tri=delaunay(x,y); #subplot(1,1,1) #[C,h]=tricontour(tri,x,y,z,v); #clabel(C) #title '我的图标题'
- Hg1
您不应将扩展代码发布到评论中,顺便说一下,这与问题(关于matplotlib而不是matlab)完全无关。如果上面的答案解决了您的问题,您应该接受它。如果没有,请编辑您的问题并清楚地指出您缺少哪些进一步信息。 - ImportanceOfBeingErnest
抱歉,我不知道在评论中不应发布代码。我提出了原始问题并选择了一个程序进行询问,以避免混淆。然而,由于我尝试做一些非常基本的事情时遇到了很多麻烦,我想其他人可能会有同样的问题,无论是在matlab还是matplotlib中,因此,如果有人发现这个线程,他们可能会欣赏两种不同程序实现相同功能的方法,具体取决于他们更熟悉的程序。我非常感谢答案!我将比较这两种方法,看哪种更好地表示系统。 - Hg1

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