Python Matplotlib等高线相交的等高线图

Python Matplotlib等高线相交的等高线图,python,matplotlib,contour,Python,Matplotlib,Contour,我正在尝试使用python中的matplotlib绘制以下数据的等高线图。数据是这种形式的- # x y height 77.23 22.34 56 77.53 22.87 63 77.37 22.54 72 77.29 22.44 88 数据实际上由近10000个点组成,我从输入文件中读取。然而,z的一组不同的可能值很小(在50-90之间,整数),我希望每个不同的z都有一条等高线 这是我的密码- import ma

我正在尝试使用python中的matplotlib绘制以下数据的等高线图。数据是这种形式的-

# x       y      height
  77.23  22.34     56
  77.53  22.87     63
  77.37  22.54     72
  77.29  22.44     88
数据实际上由近10000个点组成,我从输入文件中读取。然而,z的一组不同的可能值很小(在50-90之间,整数),我希望每个不同的z都有一条等高线

这是我的密码-

import matplotlib
import numpy as np
import matplotlib.cm as cm
import matplotlib.mlab as mlab
import matplotlib.pyplot as plt
import csv
import sys

# read data from file
data = csv.reader(open(sys.argv[1], 'rb'), delimiter='|', quotechar='"')
x = []
y = []
z = []

for row in data:
    try:
        x.append(float(row[0]))
        y.append(float(row[1]))
        z.append(float(row[2]))
    except Exception as e:
        pass
        #print e

X, Y = np.meshgrid(x, y)        # (I don't understand why is this required)

# creating a 2D array of z whose leading diagonal elements
# are the z values from the data set and the off-diagonal
# elements are 0, as I don't care about them.
z_2d = []
default = 0
for i, no in enumerate(z):
    z_temp = []
    for j in xrange(i): z_temp.append(default)
    z_temp.append(no)
    for j in xrange(i+1,  len(x)): z_temp.append(default)
    z_2d.append(z_temp)
Z = z_2d

CS = plt.contour(X, Y, Z, list(set(z)))
plt.figure()
CB = plt.colorbar(CS, shrink=0.8, extend='both')
plt.show()
这是一个小样本数据的曲线图-

下面是对上述绘图区域之一的仔细观察(注意重叠/相交线)——


我不明白为什么它看起来不像等高线图。两条线相交,这是不应该发生的。可能有什么问题?请帮助。

尝试使用以下代码。这可能会对你有所帮助——这与

我创建了一个二维高斯分布的示例输出文件。我使用上面代码的结果:

注意:

也许你注意到边缘有点不规则。这是因为
griddata
-函数创建屏蔽数组。我的意思是绘图的边界是由外部点创建的。边界以外的一切都不存在。如果您的点在一条线上,那么您将没有任何用于打印的轮廓。这是合乎逻辑的。我提到它,是因为你发布了四个数据点。看来你很可能有这个案子。也许你没有它=)

更新

我稍微编辑了一下代码。您的问题可能是没有正确解析输入文件的依赖项。使用以下代码,绘图应正常工作

import numpy as np
import matplotlib.pyplot as plt
from matplotlib.mlab import griddata
import csv

data = np.genfromtxt('example.csv', dtype=[('x',float),('y',float),('z',float)],
                     comments='"', delimiter=',')

sample_pts = 500
con_levels = 20

x = data['x']
xmin = x.min()
xmax = x.max()

y = data['y']
ymin = y.min()
ymax = y.max()

z = data['z']

xi = np.linspace(xmin,xmax,sample_pts)
yi = np.linspace(ymin,ymax,sample_pts)

zi = griddata(x,y,z,xi,yi)

plt.contour(xi,yi,zi,con_levels,linewidths=1)
plt.scatter(x,y,c=z,s=20)
plt.xlim(xmin,xmax)
plt.ylim(ymin,ymax)
plt.show()
通过这段代码和您的小样本,我得到了以下曲线图:

试着使用我的代码片段,只是稍微修改一下。例如,我必须将给定示例csv文件的定界器从
|
更改为
。我为您编写的代码不是很好,但它是直接写在前言中的


很抱歉反应太晚

这就是我如何根据你的代码得到图-。这就是我期望的结果(使用Matlab绘制)-。有什么建议吗?我真的看不到任何轮廓线。你能把数据寄给我吗。然后我可以仔细看看这个问题。嘿,帕特托尼,我真的很感谢你的帮助。我上传了一个小样本的数据在这里-。(请注意-上面的预期轮廓图链接是整个数据的链接,而不是我上传的这个示例。)感谢您继续提供帮助。成功了!然而,我不明白为什么轮廓显示点,它应该只显示线。此外,我尝试在完整的数据上绘图,但它给出了一个错误(KeyError:4002)。我在网上发现它可能是特定于Ubuntu的,而不是你的代码。不过,你可以试试看,让我知道它是否适合你。我已经在这里上传了数据,如果你想试试-。再次感谢您的帮助。按键错误是由于一些
NaN
值引起的。如果您检查输入文件(您发送给我的文件)。你会发现有些行没有内容。这就是你有问题的原因。如果您不想有点,请对命令进行注释
plt.scatter(x,y,c=z,s=20)
。我用它来检查轮廓是否正确。我会写一些关于你的代码。只是需要更多的时间。
import numpy as np
import matplotlib.pyplot as plt
from matplotlib.mlab import griddata
import csv

data = np.genfromtxt('example.csv', dtype=[('x',float),('y',float),('z',float)],
                     comments='"', delimiter=',')

sample_pts = 500
con_levels = 20

x = data['x']
xmin = x.min()
xmax = x.max()

y = data['y']
ymin = y.min()
ymax = y.max()

z = data['z']

xi = np.linspace(xmin,xmax,sample_pts)
yi = np.linspace(ymin,ymax,sample_pts)

zi = griddata(x,y,z,xi,yi)

plt.contour(xi,yi,zi,con_levels,linewidths=1)
plt.scatter(x,y,c=z,s=20)
plt.xlim(xmin,xmax)
plt.ylim(ymin,ymax)
plt.show()