[英]Matplotlib contour plot with intersecting contour lines
我正在嘗試在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
數據實際上包含將近10,000點,我正在從輸入文件中讀取這些點。 但是,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()
這是一小部分數據的圖表-
這是上圖的其中一個區域的仔細觀察(請注意重疊/相交的線)-
我不明白為什么它看起來不像輪廓圖。 線是相交的,這不應該發生。 有什么可能是錯誤的? 請幫忙。
嘗試使用以下代碼。 這可能對您有幫助-這與《 食譜》中的內容相同:
import numpy as np
import matplotlib.pyplot as plt
from matplotlib.mlab import griddata
# with this way you can load your csv-file really easy -- maybe you should change
# the last 'dtype' to 'int', because you said you have int for the last column
data = np.genfromtxt('output.csv', dtype=[('x',float),('y',float),('z',float)],
comments='"', delimiter='|')
# just an assigning for better look in the plot routines
x = data['x']
y = data['y']
z = data['z']
# just an arbitrary number for grid point
ngrid = 500
# create an array with same difference between the entries
# you could use x.min()/x.max() for creating xi and y.min()/y.max() for yi
xi = np.linspace(-1,1,ngrid)
yi = np.linspace(-1,1,ngrid)
# create the grid data for the contour plot
zi = griddata(x,y,z,xi,yi)
# plot the contour and a scatter plot for checking if everything went right
plt.contour(xi,yi,zi,20,linewidths=1)
plt.scatter(x,y,c=z,s=20)
plt.xlim(-1,1)
plt.ylim(-1,1)
plt.show()
我創建了一個具有2D高斯分布的示例輸出文件。 使用上面的代碼得到的結果是:
注意:
也許您注意到邊緣有些剪裁。 這是由於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文件,我必須更改|
的分隔符|
對,
。 我為您編寫的代碼並不是很好,但是它是直接的前言。
回復晚了非常抱歉。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.