Каков эквивалент базовой карты Matplotlib «ax1.add_collection (mylinecollection)»?

#python #python-2.7 #matplotlib #matplotlib-basemap

#python #python-2.7 #matplotlib — файл #matplotlib-базовая карта

Вопрос:

Я извлекаю широты / долготы из реляционной базы данных. Точки являются вершинами отрезков, а таблица базы данных организована таким образом, что точки могут быть сгруппированы на основе номера строки и упорядочены на основе порядкового номера точек. В частности, таблица базы данных содержит следующие поля: широта, долгота, line_number, pt_order_number.

Я собрал все сегменты линии в коллекцию строк. Он отображает, как и ожидалось, с использованием Matplotlib ax1.add_collection(mylinecollection) . Обратите внимание, что я использовал коллекции строк вместо ax1.plot(long,lat) цикла, потому что некоторые наборы данных содержат тысячи строк и десятки тысяч точек (сбор строк намного быстрее и чище).

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

Текущий код:

 # note linecollection variable produced in function; performs as expected with "ax1.add_collection(linecollection)"
latitude_range = [34.012965603200001, 34.721878621999998]
longitude_range = [-116.76151759999999, -116.33691841200002]

import matplotlib.pyplot as plt
from matplotlib.collections import LineCollection
from mpl_toolkits.basemap import Basemap

south, north = latitude_range[0], latitude_range[1]
west, east = longitude_range[0], longitude_range[1]
center = [(east west)/2, (north south)/2]

m = Basemap(llcrnrlon=west, llcrnrlat=south, urcrnrlon=east, urcrnrlat=north,
            resolution='c', epsg=4326,
            lon_0=center[0], lat_0=center[1])

m.arcgisimage(service = "World_Shaded_Relief", xpixels = 2000)
m.add_collection(linecollection) # throws error "AttributeError: 'Basemap' object has no attribute 'add_collection'"

plt.show()
  

Комментарии:

1. Базовая карта использует оси. fig, ax = plt.subplots(); m = Basemap(..., ax=ax) на этих осях вы можете вызвать любой метод, который вам нравится, ax.add_collection(...) . Убедитесь, что координаты коллекции строк сначала преобразованы в единицы базовой карты.

2. вау, как я это пропустил — большое спасибо, это работает отлично

3. @ImportanceOfBeingErnest Если это не дубликат, я думаю, на это стоило бы ответить.

Ответ №1:

Предоставляя комментарий выше в качестве ответа:

Базовая карта использует оси:

 fig, ax = plt.subplots()
m = Basemap(..., ax=ax) 
  

на этих осях вы можете вызвать любой понравившийся вам метод, например

 ax.add_collection(...)
  

Убедитесь, что координаты коллекции строк сначала преобразованы в единицы базовой карты.