Пустые фигуры с базовой картой

Я пытаюсь использовать выходные данные модели для потоков в приливном бассейне. В модели используется криволинейная сетка. Моя первая задача — просто построить график одной составляющей скорости самого высокого слоя воды. Я написал немного кода на основе вопроса под названием: Matplotlib Streamplot для неравномерной (криволинейной) сетки.

Теперь, насколько я вижу, я не изменил ничего существенного, кроме цифр, по сравнению с ранее упомянутым вопросом, но цифры остаются пустыми. Я помещаю код и некоторые цифры ниже.

import numpy as np
from mpl_toolkits.basemap import Basemap
import matplotlib.pyplot as plt

Lat = np.array([[ 30.40098833,  30.40103752,  30.40108727,  30.40113704],
 [ 30.40140046,  30.40145021,  30.40149997,  30.40154973],
 [ 30.40186559,  30.40191478,  30.40196453,  30.4020143 ],
 [ 30.40239781,  30.402447,    30.40249676,  30.40254652]])

Lon = np.array([[-86.51729818, -86.51794126, -86.5185871,  -86.51923603],
 [-86.51725858, -86.51790149, -86.51854717, -86.51919595],
 [-86.51721383, -86.51785659, -86.51850228, -86.51915089],
 [-86.51716242, -86.51780518, -86.51845087, -86.51909948]])

Xvel = np.array([[ 0.0325774,  -0.02811189, -0.04972513, -0.07736091],
 [ 0.00592685, -0.00043959, -0.00735147, -0.05015078],
 [-0.03365543, -0.03183309, -0.03701356, -0.07232581],
 [-0.09578606, -0.10139448, -0.11220678, -0.13221299]])


plt.ion()
fig,(ax1) = plt.subplots(1,1)

m = Basemap(llcrnrlon=Lon.min(),llcrnrlat=Lat.min(),
urcrnrlon=Lon.max(), urcrnrlat=Lat.max(),
projection='merc',resolution='i',ax=ax1)

m.contourf(Lat,Lon,Xvel,latlon=True)
m.drawcoastlines()
m.drawrivers()
m.plot(Lat,Lon,'-k',alpha=0.3,latlon=True)
m.plot(Lat.T,Lon.T,'-k',alpha=0.3,latlon=True)

Может ли кто-нибудь сказать мне, что заставляет участки оставаться пустыми?

У меня есть еще один вопрос относительно использования базовой карты: моя таблица данных также содержит много NaN (точки сетки без информации). Мне было интересно, как я могу сообщить Basemap, что у меня просто нет никакой информации об этих позициях и что я не хочу никаких графиков там. В текущем коде это вызывает ошибку «Точки LinearRing не образуют замкнутую строку».


person Daan Kuitenbrouwer    schedule 21.08.2015    source источник
comment
Я не уверен, как это должно выглядеть, но у меня есть пара замечаний: 1) на вашем графике вы должны делать (Lon, Lat), а не (Lat, Lon), и 2) область, охваченная широтой/долготой в этом примере, довольно небольшой, поэтому, вероятно, береговые линии и реки не отображаются.   -  person Ajean    schedule 21.08.2015
comment
Я продолжаю получать ImportError: No module named basemap, но, возможно, вам придется закончить на plt.show()   -  person DrBwts    schedule 21.08.2015
comment
@ Ajean: Большое спасибо, это действительно был просто переключатель Широта/Долгота. И вы правы насчет небольшой площади, но меня в основном интересовал "Xvel". Если я увеличу площадь, я получу береговую линию. @DrBwts: Спасибо за ваш ответ, я думаю, что ошибка импорта связана с тем, что вы, возможно, не установили пакет Basemap, а построение работает через plt.ion(), это какой-то интерактивный режим.   -  person Daan Kuitenbrouwer    schedule 24.08.2015


Ответы (1)


Что касается второй части вашего вопроса (поскольку Ажан, похоже, решил первую половину), стандартный способ сообщить Matplotlib (и, следовательно, Basemap) не отображать данные, - это создать замаскированный массив. Допустим, ваш Xvel содержит NaN, тогда для его построения вы бы сделали

import numpy.ma as ma
m.contourf(Lon, Lat, ma.masked_invalid(Xvel), latlon=True)

функция ma.masked_invalid, как следует из ее названия, маскирует все недопустимые (т. е. NaN) значения, чтобы они не отображались на графике.

person hugke729    schedule 23.08.2015