QhullError при нанесении колючек ветра - PullRequest
0 голосов
/ 08 января 2020

Когда я пытаюсь нанести ветровую планку, используя matplotlib на карте, я получаю QhullError. Я никогда не видел эту ошибку раньше, и мой код не изменился с момента моего последнего использования. Я также удостоверился, что пакеты обновлены, и используемый файл grib2 действителен, печатая переменные xarray. Ниже приведен код:

file = xr.open_dataset('/Users/victoralvarez/prog2/grib/&var_UGRD=on&var_VGRD=on.grb',
                       engine='cfgrib')

# Mask the barbs where winds < 50.
masknum = int(input('BARB THRESHOLD: '))

# Extract the lon/lat.
x = file.variables['longitude'].values
y = file.variables['latitude'].values

# Extract the desired data.
u_wind = file.variables['u'].values * units('m/s')
v_wind = file.variables['v'].values * units('m/s')

# Calculate the wind speed.
wndspd = mpcalc.wind_speed(u_wind, v_wind).to('kt')
wnds_f = wndspd.astype(float)

mask = np.ma.masked_less_equal(wnds_f, masknum).mask
u_wind[mask] = np.nan
v_wind[mask] = np.nan

fig = plt.figure(1, figsize=(15,15))
ax = plt.axes(projection=ccrs.LambertConformal(central_longitude=-100,
                                               central_latitude=35,
                                               standard_parallels=(30, 60)))

ax.set_extent([-121, -75, 25, 50], ccrs.PlateCarree())

ax.add_feature(cfeature.OCEAN.with_scale('50m'),  facecolor='#626262',
                                                  edgecolor='black',
                                                  zorder=0,
                                                  linewidth=.5)
ax.add_feature(cfeature.LAND.with_scale('50m'),   edgecolor='black',
                                                  facecolor='#626262',
                                                  zorder=1)
ax.add_feature(cfeature.STATES.with_scale('50m'), linewidth=.5,
                                                  edgecolor='black',
                                                  zorder=5)

b1 = ax.barbs(x, y, u_wind.to('kt').m, v_wind.to('kt').m,
            color='black', length=4.5, regrid_shape=20, pivot='middle',
            linewidth=1.5, zorder=103, transform=ccrs.PlateCarree())
b2 = ax.barbs(x, y, u_wind.to('kt').m, v_wind.to('kt').m,
            color='white', length=4.5, regrid_shape=10, pivot='middle',
            linewidth=0.5, zorder=104, transform=ccrs.PlateCarree())

plt.savefig('img.png', dpi=300, bbox_inches='tight')

При запуске скрипта через терминал отображаются следующие ошибки:

Traceback (most recent call last):
  File "winds_barb.py", line 63, in <module>
    linewidth=0.5, zorder=104, transform=ccrs.PlateCarree())
  File "/anaconda3/lib/python3.7/site-packages/cartopy/mpl/geoaxes.py", line 1826, in barbs
    target_extent=target_extent)
  File "/anaconda3/lib/python3.7/site-packages/cartopy/vector_transform.py", line 146, in vector_scalar_to_grid
    return _interpolate_to_grid(nx, ny, x, y, u, v, *scalars, **kwargs)
  File "/anaconda3/lib/python3.7/site-packages/cartopy/vector_transform.py", line 68, in _interpolate_to_grid
    method='linear'),)
  File "/anaconda3/lib/python3.7/site-packages/scipy/interpolate/ndgriddata.py", line 222, in griddata
    rescale=rescale)
  File "interpnd.pyx", line 248, in scipy.interpolate.interpnd.LinearNDInterpolator.__init__
  File "qhull.pyx", line 1828, in scipy.spatial.qhull.Delaunay.__init__
  File "qhull.pyx", line 354, in scipy.spatial.qhull._Qhull.__init__
scipy.spatial.qhull.QhullError: QH6019 qhull input error: can not scale last coordinate.  Input is cocircular
   or cospherical.   Use option 'Qz' to add a point at infinity.

While executing:  | qhull d Qz Qt Qbb Q12 Qc
Options selected for Qhull 2015.2.r 2016/01/18:
  run-id 1133843321  delaunay  Qz-infinity-point  Qtriangulate  Qbbound-last
  Q12-no-wide-dup  Qcoplanar-keep  _pre-merge  _zero-centrum  Qinterior-keep
  Pgood

Ответы [ 2 ]

0 голосов
/ 14 января 2020

Эта ошибка, скорее всего, вызвана введенной вами координатой широты, содержащей полюс. Следующий код воспроизведет ошибку, которую вы видите:

import cartopy.crs as ccrs
import matplotlib.pyplot as plt
import numpy as np

lons = np.array([-110, -100, -90])
lats = np.array([-90, 30, 40, 50])
u = np.ones([len(lats), len(lons)]) * 10
v = np.ones_like(u) * 10

p = ccrs.LambertConformal(
    central_longitude=-100,
    central_latitude=35,
    standard_parallels=(30, 60),
)

ax = plt.axes(projection=p)
ax.coastlines()
ax.set_extent([-121, -75, 25, 50], crs=ccrs.PlateCarree())
ax.barbs(lons, lats, u, v, regrid_shape=3, transform=ccrs.PlateCarree())

plt.show()

Но при удалении полюса ошибки нет:

lats = np.array([30, 40, 50])

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

0 голосов
/ 09 января 2020

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

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