我正在尝试制作一个等高线图,例如:

使用 txt 文件中的 3 列数据表,行数很长。
使用此代码:
import numpy as np
import matplotlib.pyplot as plt
import scipy.interpolate
data = np.loadtxt(r'dataa.txt')
a = [data[:,0]]
b = [data[:,1]]
n = [data[:,2]]
x = np.asarray(a)
y = np.asarray(b)
z = np.asarray(n)
print "x = ", x
print "y = ", y
print "z = ", z
fig=plt.figure()
CF = contour(x,y,z,colors = 'k')
plt.xlabel("X")
plt.ylabel("Y")
plt.colorbar()
plt.show()
Run Code Online (Sandbox Code Playgroud)
我不知道为什么,它不起作用。Python 为我提供了我期望看到的值的正确轴,但图中只是一个空白,我知道它正在以正确的方式导入数据,因为它在绘图之前向我显示了我的值。
表格示例:(差异是因为我的表格有 90000 行)

使用此代码:
import numpy as np
import matplotlib.pyplot as plt
import scipy.interpolate
N = 1000 #number of points for plotting/interpolation
x, y, z = np.genfromtxt(r'dataa.txt', unpack=True)
xi = np.linspace(x.min(), x.max(), N)
yi = np.linspace(y.min(), y.max(), N)
zi = scipy.interpolate.griddata((x, y), z, (xi[None,:], yi[:,None]), method='cubic')
fig = plt.figure()
plt.contour(xi, yi, zi)
plt.xlabel("X")
plt.ylabel("Y")
plt.show()
Run Code Online (Sandbox Code Playgroud)
我得到了这个结果:
我想我的建议是错误的。
我的评论的后续......首先,我将替换所有这些行:
data = np.loadtxt(r'dataa.txt')
a = [data[:,0]]
b = [data[:,1]]
n = [data[:,2]]
x = np.asarray(a)
y = np.asarray(b)
z = np.asarray(n)
Run Code Online (Sandbox Code Playgroud)
和:
x, y, z = np.genfromtxt(r'dataa.txt', unpack=True)
Run Code Online (Sandbox Code Playgroud)
您的原始代码在前面添加了一个额外的轴,因为它[data[:,0]]是一个包含一个元素的数组列表。其结果是,x.shape将(1, N)代替如果(N,)。所有这些都可以使用上面的最后一行自动完成,或者您可以使用相同的data加载并说:
x = data[:,0]
y = data[:,1]
z = data[:,2]
Run Code Online (Sandbox Code Playgroud)
因为这些切片会给你一个数组。
但是,您还没有完全完成,因为plt.contour希望您为它提供一个二维数组z,而不是一维值数组。现在,您似乎z在给x, y定点有值,但contour希望您给它一个二维数组,如图像。
之前,我可以回答这个问题,我需要知道如何x和y间隔。如果定期,你可以很容易地填充一个数组。如果不定期,您基本上必须先进行插值,然后才能制作等高线图。
要进行插值,请使用
import numpy as np
import matplotlib.pyplot as plt
import scipy.interpolate
N = 1000 #number of points for plotting/interpolation
x, y, z = np.genfromtxt(r'dataa.txt', unpack=True)
xi = np.linspace(x.min(), x.max(), N)
yi = np.linspace(y.min(), y.max(), N)
zi = scipy.interpolate.griddata((x, y), z, (xi[None,:], yi[:,None]), method='cubic')
fig = plt.figure()
plt.contour(xi, yi, zi)
plt.xlabel("X")
plt.ylabel("Y")
plt.show()
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
10736 次 |
| 最近记录: |