2017-01-19 2 views
-3

Я пытаюсь построить простой сюжет с использованием спутниковых данных. Эти данные содержат lat, lon и sla (аномалия уровня моря). Данные, которые я использовал для этого примера находится here Это простой скрипт я пытаюсь начали экспериментировать с здесь: -Данные, имеющие разные размеры с использованием matplotlib

#!/usr/bin/python3 
# -*- coding: utf-8 -*- 
from __future__ import print_function 
import os 
import platform 
import numpy as np 
from netCDF4 import Dataset 
import matplotlib.pyplot as plt 
from mpl_toolkits.basemap import Basemap 

width = 10 
height = 8 

nc_f = ('ctoh.sla.ref.RA2.medsea.0543.nc') 
nc_fid = Dataset(nc_f, 'r') 
lons = nc_fid.variables['lon'][:] 
lats = nc_fid.variables['lat'][:] 
sla = nc_fid.variables['sla'][:] 

lon_0 = lons.mean() 
lot_0 = lats.mean() 
lon_max = nc_fid.variables['lon'].lon_max 
lon_min = nc_fid.variables['lon'].lon_min 
lat_min = nc_fid.variables['lat'].lat_min 
lat_max = nc_fid.variables['lat'].lat_max 

m = Basemap(projection='merc', lat_0=lot_0, lon_0=lon_0, 
      resolution = 'l', llcrnrlon=lon_min, llcrnrlat=lat_min, 
      urcrnrlon=lon_max, urcrnrlat=lat_max) 
m.drawcoastlines() 
m.drawcountries(linewidth=1.0) 
# lons,lats= np.meshgrid(lons, lats) 
x, y = m(lons, lats) 
# plt.figure(figsize=(width, height), frameon=False) 
# plt.contourf(x, y, sla) 
print(y.shape) 
print(x.shape) 
print(sla.shape) 
cs = m.contourf(x, y, sla) 
plt.contourf(np.reshape(x, sla.shape), np.reshape(y, sla.shape), sla) 
plt.show() 

В чем проблема я столкнулся в том, что широта и долгота содержит форму 164 и фактическая переменная, которая должна быть построена на базовой карте, содержит форму (164, 83). Вот полное сообщение об ошибке я попал в терминале: -

(164,) 
(164,) 
(164, 83) 
Traceback (most recent call last): 
    File "satellite.py", line 39, in <module> 
    cs = m.contourf(x, y, sla) 
    File "/home/sundar/.anaconda2/lib/python2.7/site-packages/mpl_toolkits/basemap/__init__.py", line 521, in with_transform 
    return plotfunc(self,x,y,data,*args,**kwargs) 
    File "/home/sundar/.anaconda2/lib/python2.7/site-packages/mpl_toolkits/basemap/__init__.py", line 3644, in contourf 
    xx = x[x.shape[0]/2,:] 
IndexError: too many indices for array 

Это первый раз, когда я имею дело с данными, имеющими diffent размеров/формой. Как эти данные имеют разные формы?

+1

Я немного смущен, что именно вы пытаетесь построить? Если я правильно понимаю, у вас есть 164 пары lat/lon и 83 точки данных в каждой паре? Как эти 83 точки должны быть интерпретированы? – roganjosh

+0

Собственно, просмотр этого примера может помочь из [docs] (http://basemaptutorial.readthedocs.io/en/latest/plotting_data.html#contourf). Возможно, стоит рассмотреть пример источника данных (который, как представляется, требует наличия библиотеки 'osgeo'). Я бы также подумал об изменении имени вопроса с 'matplotlib' на' basemap', потому что я нашел, что это целый зверь из 'matplotlib'. – roganjosh

+0

У вас нет. Это ясно указано в docstring: '* X * и * Y * должны быть двухмерными с той же формой, что и * Z *, или они должны быть равны 1-D таким образом, чтобы' 'len (X)' ' число столбцов в * Z * и '' len (Y) '' - количество строк в * Z * .' – Goyo

ответ

2

Если я понимаю документацию Basemap.contourf правильно, вы должны использовать аргумент tri ключевых слов для неструктурированных данных:

cs = m.contourf(lon, lat, sla, tri=True) 

или, возможно,

cs = m.contourf(x,y, sla, tri=True) 

в зависимости от того, что ваши данные.

+0

Я не знаю, кто проголосовал за мой вопрос. Если они не поняли, они должны были попросить разъяснения. Вы дали мне правильный ответ. Спасибо, что указали на ошибку. –

+0

Я бы предположил, что 3 человека, которые проголосовали за ваш вопрос, не смогли увидеть реальную проблему, которая скрыта за кучей кода, который не является непосредственно [MCVE]. Также на первый взгляд, читая вопрос, может показаться, что вы спрашиваете о том, как строить данные с разными формами, используя matplotlibs 'contourf', что, конечно, невозможно, и можно также ожидать, что кто-то найдет это, не задав вопрос. Возможно, это препятствовало тому, что вы используете 'Basemap.contourf', который отличается от matplotlibs' contourf'. – ImportanceOfBeingErnest

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