2014-01-05 2 views
0

Извините, что мне нужно продолжать возвращаться к задаче, неравномерно распределенной по данным. Кажется, я не вижу четких ответов на вопросы о том, как собирать данные в обычную сетку, а документация по программному обеспечению для меня хороша для тех, кто уже знает. У меня есть x, y, z данные на 29 баллов, с заголовком «Lon Lat Z». для построения контуров с этими данными здесь является то, что я делаю:использование matlab meshgrid

  1. После считывания данных, сделать 300 на 300 точек регулярной сетки, на которую в интерполировать

    numcols, numrows = 300, 300 
    xi = np.linspace(data.Lon.min(), data.Lon.max(), numcols) 
    yi = np.linspace(data.Lat.min(), data.Lat.max(), numcols) 
    xi, yi = np.meshgrid(xi, yi) 
    

    Печать XI и печати уг в эта точка дает мне x и y по моим данным, интерполируется более 300x300 точек.

  2. Интерполируйте данные по сетке, созданной выше

    x, y, z = data.Lon.values, data.Lat.values, data.Z.values 
    zi = griddata(x, y, z, xi, yi) 
    

    На данный момент, если я print zi я получаю

    [[- - - ..., - - - -]
    [- - - ..., - - -]
    [- - - ..., - - -]
    ...,
    [- - - ..., - - -]
    [- - - ..., - - -]
    [- - - ..., - - -]]

Я ожидал увидеть значения интерполированного z. У меня также есть объект карты, который должен быть наложен контурами. Функция построения рисунков дает мне отдельные цифры, для базовой карты и для контуров, с правильными значениями контура. Мой вопрос: почему я получаю пустые значения для контуров и как они выглядят правильно? Для полноты здесь моя функция зарисовки

fig=plt.figure(figsize=(8,4.5)) 
im = plt.contourf(xi, yi, zi) 
plt.show() 

Два участка придумали (базовая карта и контуры бок о бок)

Любая помощь, пожалуйста.

+0

Очевидная опечатка: в xi и yi, вы используете numcols, не должно быть numrows и numcols? Другое дело: можете ли вы отступывать свое сообщение лучше? так как в определенный момент вы говорите «1.» но не приходит "2." ? – usethedeathstar

+0

Спасибо @usethedeathstar за то, что вы указали ошибку опечатки. 1. читает в данных и создает сетку и 2. есть, что интерполирует –

ответ

0

должно работать:

numcols, numrows = 300, 300 
xi = np.linspace(data.Lon.min(), data.Lon.max(), numrows) 
yi = np.linspace(data.Lat.min(), data.Lat.max(), numcols) 
xi, yi = np.meshgrid(xi, yi) 

x, y, z = data.Lon.values, data.Lat.values, data.Z.values 
points = np.vstack((x,y)).T 
values = z 
wanted = (xi, yi) 
zi = griddata(points, values, wanted) 

Так что последняя строка, как griddata работы Проблема у вас есть то, что вы, кажется, дают griddata пять аргументов, в то время как, если я смотрю (предполагая, что вы используете scipy.interpolate.griddata?) в http://docs.scipy.org/doc/scipy/reference/generated/scipy.interpolate.griddata.html#scipy.interpolate.griddata это говорит следующее:

scipy.interpolate.griddata(points, values, xi, method='linear', fill_value=nan) 

Так что в вашем случае, давая пять аргументов, где это идет не так, я думаю, (подтвердить, если это работает, если вы делаете это так, так как У меня нет данных, поэтому я не могу проверить, дает ли он правильный результат).

Итак, в вашем случае ваши точки, в которых известны значения, - это x, а значения, которые известны в этой точке, - это значения y, а точки, в которых вы хотите их узнать, находятся в значениях z ,Не знаю, как справится с вашим аргументом method='linear', и вы даете fill_value, так что вы должны просто дать правильные входы (что, я думаю, правильно, как я их сформулировал), а затем он должен работать правильно.

Редактировать: читать в ваших данных как txt и писать следующий код. Можете ли вы запустить его, чтобы убедиться, что это тот результат, который вам нужен?

import numpy as np 
from scipy.interpolate import griddata 
class d(): 
    def __init__(self): 
     A0 = open("test.txt","rb") # i just copypasted your data into a txt (without first row), and reading it in in this class, so that the names are the same as yours 
     A1 = A0.readlines() 
     A = np.zeros((len(A1),3)) 
     for i, l in enumerate(A1): 
      li = l.split() 
      A[i,0] = float(li[0]) 
      A[i,1] = float(li[1]) 
      A[i,2] = float(li[2]) 
     self.Lon = A[:,0] 
     self.Lat = A[:,1] 
     self.Z = A[:,2] 

data = d() 
numcols, numrows = 30, 30 
xi = np.linspace(data.Lon.min(), data.Lon.max(), numrows) 
yi = np.linspace(data.Lat.min(), data.Lat.max(), numcols) 
xi, yi = np.meshgrid(xi, yi) 

x, y, z = data.Lon, data.Lat, data.Z 
points = np.vstack((x,y)).T 
values = z 
wanted = (xi, yi) 
zi = griddata(points, values, wanted) 
import pylab as plt 
fig = plt.figure(0, figsize=(8,4.5)) 
im = plt.contourf(xi, yi, zi) 
plt.colorbar() 
fig2 = plt.figure(1, figsize=(8,4.5)) 
im = plt.scatter(xi, yi, c= zi) 
plt.colorbar() 
plt.show() 
+0

спасибо, что ты указал мне в правильном направлении. Теперь «print zi» дает мне массив, как раньше, но с nan повсюду. Я буду продолжать работать над этим, основываясь на указанной scipy ссылке. Спасибо за ваше время. –

+0

@ ZiloreMumba, что странно, можете ли вы распечатать некоторые данные? так что я могу проверить, где это неправильно? Вероятно, из-за смешивания xi и yi где-то, поскольку он даст nan (из-за fill_value), если вы находитесь вне выпуклой области, ограниченной вашими точками – usethedeathstar

+0

, вы можете увидеть данные о моем предыдущем SO post здесь http://stackoverflow.com/questions/20892251/contours-with-map-overlay-on-irregular-grid-in-python, и вот он: Lon Lat Z Z2 pos 32.6 -13.6 41 9 CHIP 27.1 -16.9 43 12 чом 32,7 -10,2 46 14 ISOK 24,2 -13,6 33 13 KABO 28,5 -14,4 43 11 KABW 28,1 -12,6 33 16 Kafi 27,9 -15,8 46 13 КАСУ 24,8 -14,8 44 9 KAOM 31,1 -10,2 35 14 KASA 25.9 -13.5 24 8 KASE 29.1 -9.8 10 13 KAWA 25.8 -17. 8 39 11 LIVI 33.2 -12.3 44 8 LUND –

Смежные вопросы