Участок только на континенте в matplotlib

Я рисую карту, используя базовую карту из matplotlib. Данные распространяются по всему миру, но я просто хочу сохранить все данные на континенте и сбросить их на океан. Есть ли способ, чтобы я мог фильтровать данные, или есть способ снова нарисовать океан, чтобы покрыть данные?

4 Solutions collect form web for “Участок только на континенте в matplotlib”

Есть метод в matplotlib.basemap: is_land(xpt, ypt)

Он возвращает значение True если заданная точка x, y (в координатах проецирования) находится над землей, в противном случае False . Определение земли основано на полигонах береговой линии GSHHS, связанных с экземпляром класса. Точки над озерами внутри земельных участков не считаются точками суши.

Для получения дополнительной информации см. Здесь .

is_land() будет зацикливать все полигоны, чтобы проверить, земля ли она. Для большого размера данных это очень медленно. Вы можете использовать points_inside_poly() из matplotlib, чтобы быстро проверить массив точек. Вот код. Он не проверяет lakepolygons , если вы хотите удалить точки в озерах, вы можете добавить себя.

Для проверки 100000 точек на моем ПК потребовалось 2,7 секунды. Если вы хотите увеличить скорость, вы можете преобразовать многоугольники в растровое изображение, но это немного сложно сделать. Скажите, пожалуйста, если следующий код недостаточно быстро для вашего набора данных.

 from mpl_toolkits.basemap import Basemap import numpy as np import matplotlib.pyplot as plt import matplotlib.nxutils as nx def points_in_polys(points, polys): result = [] for poly in polys: mask = nx.points_inside_poly(points, poly) result.extend(points[mask]) points = points[~mask] return np.array(result) points = np.random.randint(0, 90, size=(100000, 2)) m = Basemap(projection='moll',lon_0=0,resolution='c') m.drawcoastlines() m.fillcontinents(color='coral',lake_color='aqua') x, y = m(points[:,0], points[:,1]) loc = np.c_[x, y] polys = [p.boundary for p in m.landpolygons] land_loc = points_in_polys(loc, polys) m.plot(land_loc[:, 0], land_loc[:, 1],'ro') plt.show() 

Ответ HYRY не будет работать над новыми версиями matplotlib (nxutils устарел). Я создал новую версию, которая работает:

 from mpl_toolkits.basemap import Basemap import matplotlib.pyplot as plt from matplotlib.path import Path import numpy as np map = Basemap(projection='cyl', resolution='c') lons = [0., 0., 16., 76.] lats = [0., 41., 19., 51.] x, y = map(lons, lats) locations = np.c_[x, y] polygons = [Path(p.boundary) for p in map.landpolygons] result = np.zeros(len(locations), dtype=bool) for polygon in polygons: result += np.array(polygon.contains_points(locations)) print result 

Самый простой способ – использовать маскасманы basemap .

После meshgrid и интерполяции:

 from scipy.interpolate import griddata as gd from mpl_toolkits.basemap import Basemap, cm, maskoceans xi, yi = np.meshgrid(xi, yi) zi = gd((mlon, mlat), scores, (xi, yi), method=grid_interpolation_method) #mask points on ocean data = maskoceans(xi, yi, zi) con = m.contourf(xi, yi, data, cmap=cm.GMT_red2green) #note instead of zi we have data now. 
  • ImportError при импорте базы данных
  • Как показать метку шейп-файла в легенде базовой карты python?
  • Как построить линию сетки только с помощью pcolor / pcolormesh
  • Python: скопируйте базовую карту или удалите данные с рисунка
  • IndexError с Basemap.contour () при использовании определенных прогнозов
  • цветная карта matplotlib с использованием бикубической интерполяции
  • Python и Matplotlib и аннотации с указателем мыши
  • Как удалить / опустить небольшие контурные линии, используя matplotlib
  • Python - лучший язык программирования в мире.