контурный график в matplotlib на несортированных, но регулярно разнесенных данных - PullRequest
0 голосов
/ 09 мая 2020

У меня есть файл данных с точками данных x, y, z, например:

# X Y Z
1.0 1 0.1  
1.0 2 0.2  
1.0 3 0.3  
2.1 3 0.5  
2.1 2 0.2  
2.1 1 0.4  
...

Я смог прочитать данные, которые мне нужны, и построить его следующим образом:

import numpy as np
import matplotlib.pyplot as plt

data = np.loadtxt("data.dat",skiprows=1,usecols= (0,1,2))

X, Y = np.meshgrid(data[:,0], data[:,1])
Z = np.tile(data[:,2], (len(data[:,2]), 1))

fig=plt.figure()
plt.contourf(X,Y,Z,levels=50)
cbar = plt.colorbar()
plt.show()

Однако полученный контур неправильный. Входные данные регулярно размещаются в сетке (значения N x, значения M y), но файл не создается в отсортированном виде. Как я могу гарантировать, что данные считаны и отсортированы правильно, не зная точного значения N и M.

1 Ответ

1 голос
/ 10 мая 2020

meshgrid не будет производить то, что вы хотите, так, как вы его используете. Один из способов представить это: meshgrid создает данных (от n+m точек данных до n*m + n*m точек данных), но вам не нужно создавать данные, вам просто нужно сортировать и формировать то, что у вас уже есть.

Вы можете отсортировать это, используя numpy, но в этом случае, когда вы хотите отсортировать строки, используя значения из одного столбца, Pandas проще ; в примере здесь используется одна строка data.sort_values("Y"). Все остальное здесь просто поддержка этой линии.

import matplotlib.pyplot as plt
import numpy as np
import pandas as pd

# make some data and plot it... getting back to this is the goal
x = np.arange(4)
X, Y = np.meshgrid(x, x)
Z = X + Y
a = np.array([X, Y, Z])

fig=plt.figure()
plt.contourf(a[0], a[1], a[2])
cbar = plt.colorbar()

enter image description here

# now shuffle it and write to a file to mimic your data
np.random.shuffle(a.T)
b = a.reshape((3, -1))
with open("data.dat", 'w') as outfile:
    outfile.write("X Y Z\n")
    for i, j, k in b.T:
        outfile.write("%i %i %i\n" % (j, i, k))

# Here's where you start:
# now read in the data
data = pd.read_csv("data.dat", sep=" ")
# note that Y is out of order
print(data.T)  # print transposed to save space
#    0  1  2  3  4  5  6  7  8  9  10  11  12  13  14  15
# X  0  0  0  0  1  1  1  1  2  2   2   2   3   3   3   3
# Y  3  2  0  1  3  2  0  1  3  2   0   1   3   2   0   1
# Z  3  2  0  1  4  3  1  2  5  4   2   3   6   5   3   4

# sort the data
data2 = data.sort_values("Y")
#     2   6   10  14  3   7   11  15  1   5   9   13  0   4   8   12
# X   0   1   2   3   0   1   2   3   0   1   2   3   0   1   2   3
# Y   0   0   0   0   1   1   1   1   2   2   2   2   3   3   3   3
# Z   0   1   2   3   1   2   3   4   2   3   4   5   3   4   5   6

# Reshape and plot the data
c = data2.T.reshape((3, 4, 4))
fig=plt.figure()
plt.contourf(c[0], c[1], c[2])
cbar = plt.colorbar()

enter image description here

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...