2013-08-19 41 views
1

我想在等高线上绘制一个函数,该函数在单位正方形的4个顶点 处为0,在该正方形的中间有1个顶点。我尝试这样做:Python/MatPlotLib产生奇怪的,意想不到的轮廓

import matplotlib.pyplot 
z = [[0,0,0], [1,0,0], [0,1,0], [1,1,0], [.5,.5,1]] 
cn = matplotlib.pyplot.contour(z) 
matplotlib.pyplot.show(cn) 

,并得到这样的:

enter image description here

我期望的一系列同心正方形的,就像这样:

enter image description here

这是我得到的时候我做

ListContourPlot[{{0,0,0}, {1,0,0}, {0,1,0}, {1,1,0}, {.5,.5,1}}, 
ColorFunction -> (Hue[#1]&)] 

在Mathematica中。

我做错了什么?

编辑:我意识到有多种方式绘制给定数据的轮廓。在这种情况下,一系列同心圆也会很好。

+1

我不明白你为什么会期望与你正在绘制的阵列同心环。如果你想在中间有一个零,那么你肯定想要更类似这样的东西:'z = np.array([[0,0,0],[0,1,0],[0,0, 0]])'。 –

回答

5

对于非网格数据,如评论所说,你可能想使用tricontour功能:

>>> import matplotlib.pyplot as plt 
>>> z = [[0,0,0], [1,0,0], [0,1,0], [1,1,0], [.5,.5,1]] 
>>> x, y, z = zip(*z) 
>>> cn = plt.tricontourf(x, y, z) 
>>> plt.show() 

output

HTH

+0

谢谢!我正在批准这个答案,因为我确定它会 工作。不幸的是,我的matplotlib没有tricontourf() 函数。我试图升级到matplotlib 1.3.0,但这需要 和numpy 1.5,并且我尝试升级numpy失败,出现链接器 错误。 虽然我确信我可以最终得到这个工作,但我会去 寻求一种使用qhull的方法。 实际上,它看起来像scipy使用qhull的一些工作,无论如何,所以直接使用qhull应该有希望工作。 – barrycarter

4

的问题是,因为预期输入是完全不同的

mathematica ContourListPlot预计形式{x, y, z}点的名单(您呼叫的方式)。

matplotlib contour(您调用它的方式)期望值为z的数组。

根据您的输入,它会生成正确的轮廓。要清楚地看到这个,请看imshow(z)

+0

所以它期望的z值将应用于之前提供的x和y值的网格?这是否意味着,我不能使用诸如插值之类的东西给它任意的(非网格)x,y,z三元组? – barrycarter

+0

不允许使用三元组,如果要轮廓非网格化数据,则可能需要在mpl中寻找广泛的三元组例程。三轮车是其中之一。 HTH – pelson