如何将列向量绘制为轮廓,并且非均匀网格点也是列向量?

时间:2019-02-25 19:48:54

标签: python numpy matplotlib contour

我具有以下形式的数据(link):

输入数据格式

Header: 'x' 'y'  'a'  'b'
x1  , y1  , ... (data)
x2  , y2  , ... (data)
x3  , y3  , ... (data)
 :     :           :
xn-2, yn-2, ... (data)
xn-1, yn-1, ... (data)
xn  , yn  , ... (data)

它们是非均匀间隔的网格,在这种情况下,我想绘制一个填充轮廓,该轮廓由a,b着色。由于点的排列和不均匀性,我无法使用np.meshgrid(如果我错了,请更正我)。如何将列向量绘制为轮廓,这些点的非均匀网格点也是列向量?

MWE

import numpy as np
import matplotlib.pyplot as plt

data = np.genfromtxt('./plot_data.dat', skip_header=1, dtype = None, delimiter = '\t')
test = np.column_stack([data[:,0],data[:,1],data[:,3]])
plt.imshow(test)
plt.xlim([np.min(data[:,0]), np.max(data[:,0])])
plt.ylim([np.min(data[:,1]), np.max(data[:,1])])        
plt.show()

1 个答案:

答案 0 :(得分:1)

numpy.meshgrid对于非统一的1-d域应该没有问题。但是,您的二维数据在数据文件中分布不规则(请参见发布末尾的图)。这还有其他问题。但是,按照@Thomas-Kühn的建议,matplotlib.pyplot.tricontourmatplotlib.pyplot.tricontourf可以处理您的数据(以下我使用tricontourf):

import numpy as np
import matplotlib.pyplot as plt

x,y,a,b = np.loadtxt('./plot_data.dat', skiprows=1, delimiter = '\t').T
plt.tricontourf(x,y,a)

ab数据的结果在左右(请注意,黑色将两个数字分隔开,白色表示缺少数据):

a on left, b on right

由于数据的稀疏性,使用matplotlib.pyplot.scatter(x,y,c=a)的散点图也可能有用(当然,要有足够的xy轴标签):

scatter plot, a on left, b on right

或者将填充的等高线图与点的表示形式结合在一起(将先前的tricontourf与域的简单plot结合起来:

a on left and b on right

最后,您可能会喜欢matplotlib.pyplot.hexbin

enter image description here