Введение

Чему мы научимся

Если вы пропустили мою последнюю статью, мы изучаем картографическую библиотеку Python Folium, используя забавный набор данных о наблюдениях снежного человека. Если вы не знакомы с Folium, загляните туда, чтобы получить краткое представление и получить массу удовольствия от изучения данных о снежном человеке. Вы можете перейти к моей предыдущей статье, чтобы узнать, что вы можете узнать о Folium и какие данные вам понадобятся, или перейти непосредственно на мою страницу GitHub, чтобы загрузить данные. Если вы хотите следить за этой статьей, вы также можете одновременно следить за ней в Jupyter Notebook, в которой есть интерактивные версии карт, которые мы будем делать, а также весь код.

Фолиевые маркеры

В этой статье мы рассмотрим маркеры. В частности, как изменить цвета маркеров, значки маркеров, всплывающий текст маркеров и всплывающие подсказки маркеров на картах Folium. Будет очень весело. Давайте углубимся.

Начиная

Маркеры

Во-первых, давайте возьмем файл местоположения наблюдений снежного человека из data/bfro_report_locations.csv и поместим его в Pandas DataFrame, чтобы заново ознакомиться с набором данных. Это упрощенная версия набора данных, содержащая в основном только данные о местоположении, которые мы будем использовать для создания карт.

bf_locations = pd.read_csv('data/bfro_report_locations.csv')
bf_locations.head()

Изменение цвета маркера

Чтобы начать изучение маркеров, давайте создадим карту с центром в Соединенных Штатах и ​​разместим простой маркер по умолчанию. Если вы помните из моей последней статьи, это место находится недалеко от центра континентальной части Соединенных Штатов, Диринга, штат Канзас, где произошло большинство наблюдений снежного человека. Мы нарисуем это здесь, чтобы начать.

Прямо сейчас я извинюсь, пока вы не зашли слишком далеко. Средний рендеринг моего кода Python в блоки кода не самый лучший. Чтобы получить наилучшие впечатления, следите за интерактивным Блокнотом Jupyter.

# This is our map lovingly centered on Dearing Kansas at a 15 zoom
kansas_map = folium.Map(location=[37.0902, -95.7129], zoom_start=15)
# Add the marker to the map...
folium.Marker(location=[37.0902, -95.7129]).add_to(kansas_map)
# Display the map with the marker that's been added
kansas_map

Большой! У нас есть начало здесь. Простая карта с маркером в Диринге, штат Канзас. Теперь давайте посмотрим, как мы можем настроить маркер на карте.

Изменение значка внутри маркера

Вы можете изменить значок и цвет маркера на значок информации в параметре icon объекта Marker. Давайте изменим цвет маркера на красный.

Вы можете использовать любое из этих названий для цветов маркеров: {'темно-красный', 'красный', 'светло-зеленый', 'черный', 'светло-серый', 'светло-красный', 'кадетский синий', 'бежевый', 'белый', 'розовый ', 'фиолетовый', 'темно-синий', 'оранжевый', 'светло-голубой', 'темно-зеленый', 'темно-фиолетовый', 'зеленый', 'серый', 'синий'}.

# This is our map lovingly centered on Dearing Kansas at a 15 zoom
kansas_map = folium.Map(location=[37.0902, -95.7129], zoom_start=15)
# Add the marker to the map...
folium.Marker(location=[37.0902, -95.7129],
              icon=folium.Icon(color="red", # Outside Color
                               icon_color='white', # Icon Color
                               icon='info-sign' # Type of Icon
                               )
              ).add_to(kansas_map)
# Display the map with the marker that's been added
kansas_map

Изменение цвета значка

Вы можете изменить значок внутри маркера, изменив параметр icon. Давайте изменим значок на флажок.

# This is our map lovingly centered on Dearing Kansas at a 15 zoom
kansas_map = folium.Map(location=[37.0902, -95.7129], zoom_start=15)
# Add the marker to the map...
folium.Marker(location=[37.0902, -95.7129],
              icon=folium.Icon(color="black", # Outside Color
                               icon_color='white', # Icon Color
                               icon='glyphicon-check' # Type of Icon
                               )
              ).add_to(kansas_map)
# Display the map with the marker that's been added
kansas_map

В Font Awesome есть целый ряд действительно крутых иконок на выбор. Чтобы использовать их значки, просто установите для параметра prefix значение 'fa'. Согласно Документации Folium, Префикс указывает источник значка. «fa для font-awesome или glyphicon для bootstrap 3”

Давайте попробуем еще один для удовольствия!

# This is our map lovingly centered on Dearing Kansas at a 15 zoom
kansas_map = folium.Map(location=[37.0902, -95.7129], zoom_start=15)
# Add the marker to the map...
folium.Marker(location=[37.0902, -95.7129],
              icon=folium.Icon(color="red", # Outside Color
                               icon_color='white', # Icon Color
                               icon='rebel', # Type of Icon
                               prefix='fa' # To use Font Awesome
                               )
              ).add_to(kansas_map)
# Display the map with the marker that's been added
kansas_map

Да, помимо того, что я увлечен наукой о данных и увлекаюсь анализом данных о снежном человеке, я также являюсь фанатом Звездных войн. Вы можете проверить больше действительно крутых иконок Font-Awesome на их веб-сайте.

Как создавать всплывающие окна на маркере

Вы можете изменить цвет значка, установив параметр icon_color, используя любое из этих имен для цветов значка:

{'темно-красный', 'красный', 'светло-зеленый', 'черный', 'светло-серый', 'светло-красный', 'кадетский синий', 'бежевый', 'белый', 'розовый', 'фиолетовый', 'темно-синий', ' оранжевый», «светло-голубой», «темно-зеленый», «темно-фиолетовый», «зеленый», «серый», «синий»}.

# This is our map lovingly centered on Dearing Kansas at a zoom of 15
kansas_map = folium.Map(location=[37.0902, -95.7129], zoom_start=15)
# Add the marker to the map...
folium.Marker(location=[37.0902, -95.7129],
              icon=folium.Icon(color="darkgreen", # Outside Color
                               icon_color='pink', # Icon Color/Inside Color
                               icon='tree', # What Kind of Icon to Use
                               prefix='fa', # To use Font Awesome icons
                               ),
              popup='The Great Pink Tree of Kansas' # Set the Pop Up text for the marker
              ).add_to(kansas_map)
# Display the map with the marker that's been added
kansas_map

Как создать всплывающую подсказку на маркере

Что, если есть что-то, что вы хотите, чтобы пользователи вашей карты знали о местоположении? Вы можете использовать всплывающее окно, чтобы поделиться информацией о местоположении. Просто установите параметр popup в объекте Marker. Когда карта отобразится, просто щелкните маркер, и появится всплывающее окно.

# This is our map lovingly centered on Dearing Kansas at a 15 zoom
kansas_map = folium.Map(location=[37.0902, -95.7129], zoom_start=15)
# Add the marker to the map...
folium.Marker(location=[37.0902, -95.7129],
              icon=folium.Icon(color="purple", # Outside Color
                               icon_color='white', # Icon Color
                               icon='map-pin', # Type of Icon
                               prefix='fa', # To use Font Awesome
                               ),
              # Set the Pop Up text for the marker              
              popup='Center of the U.S.\nDearing, Kansas' 
              ).add_to(kansas_map)
# Display the map with the marker that's been added
kansas_map

Исследование снежного человека

Что, если вам не нужно всплывающее окно при нажатии на маркер, а вместо этого всплывающая подсказка при наведении курсора? Что ж, фолиум вас и здесь прикрыл.

# This is our map lovingly centered on Dearing Kansas at a 15 zoom
kansas_map = folium.Map(location=[37.0902, -95.7129], zoom_start=15)
# Add the marker to the map...
folium.Marker(location=[37.0902, -95.7129],
              icon=folium.Icon(color="orange", # Outside Color
                               icon_color='black', # Icon Color/Inside Color
                               icon='lemon-o', # Type of Icon
                               prefix='fa', # To use Font Awesome
                               ),
              # Set the tool tip text for the marker
              tooltip="It's an orange lemon because folium doesn't have the color yellow...." 
              ).add_to(kansas_map)
# Display the map with the marker that's been added
kansas_map

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

Заключение

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

alt.Chart(bf_locations['timestamp'].dt.year.value_counts().reset_index()).mark_bar().encode(
    x='timestamp:Q',
    y=alt.Y('index:O', sort='-x')
)

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

alt.Chart(bf_locations['timestamp'].dt.year.value_counts().reset_index()).mark_bar().encode(
    x='index:O',
    y='timestamp:Q'
)

2053? Путешественники во времени видели снежного человека в будущем? Эти данные становятся все более странными. В моей последней статье мы видели места встреч в Тихом океане. Теперь у нас есть путешественники во времени?!? Что мы увидим дальше? Давайте просто перепроверим эти данные, чтобы убедиться, что мы не ошиблись.

bf_locations.where(bf_locations['timestamp'].dt.year == 2053).dropna(how='all')

Хорошо, запись есть, но что-то не так. Либо дата опечатка, либо некоторые люди считают, что они путешествовали во времени. Давайте посмотрим на отчет, чтобы увидеть, дает ли он нам какие-либо подсказки:

report_df = pd.read_csv('data/bfro_reports_geocoded.csv')
print(report_df[report_df['number'] == 45647]['observed'].values)

Что ж, приятно знать, что в 2053 году девочки-скауты набирают силу, потому что «тогда» вы могли бы «приписать такие вещи дьяволу из джерси». Я рад, что все обошлось. Я также посмотрел «Джерси Дьявол». Сасквотч мне больше нравится…

Я не могу размещать здесь какие-либо изображения из-за возможного нарушения авторских прав, но поищите изображения. Это стоит того.

Думаю, можно с уверенностью сказать, что дата в этой записи неточна. Мы все равно исключим его из карты и нанесем на карту наблюдения 2004 года. Чтобы было немного интереснее, нанесем маркеры следующей цветовой схемой:

Мы также разместим всплывающую подсказку с датой и заголовком в виде всплывающего окна, когда пользователь щелкает маркер. Похоже на план? Прохладный. Пойдем!

  • Весна: Зеленый
  • Осень: оранжевый
  • Зима: Синий
  • Это был поход девушки-скаута в то, что сейчас называется Государственным лесом Брендана Т. Бирна. Тогда он назывался Ливанским государственным лесом. Это в северном районе Нью-Джерси Пайн Барренс. Мы были отрядом скаутов, состоящим примерно из 20 девочек в возрасте 8-10 лет и трех вожатых лагеря. Вожатые лагеря приготовили для нашего ужина в первую ночь огромную кастрюлю спагетти и фрикадельки. Чтобы добраться до этого кемпинга, вы въехали в отдаленный район по песчаной дороге шириной в одну машину. Песок был очень мягким, и машины могли застрять в песке. Затем вы припарковались, когда эта дорога закончилась, и пошли пешком через лес к озеру, кажется, оно называлось Кедровое озеро. Мы должны были разбить лагерь на берегу озера. Это было в июне месяце, я полагаю, поэтому было жарко и очень сухо, ясная ночь, луна светила везде после того, как стемнело. Что ж, вскоре после того, как мы разожгли костер и начали распаковывать свое снаряжение, вожатая подошла очень расстроенная, сказав, что огромная кастрюля со спагетти и фрикадельками пропала, никто понятия не имел, где она была, она положила это с другим снаряжением возле костра, и оно просто исчезло. Так что ужина в тот вечер не было. Она заставила нас всех собраться вокруг костра, чтобы она могла следить за нами, пересчитывать головы. Потом началось, топот кустов сразу за лагерем в лесу вокруг нас, он кружил вокруг да около, потом снова и снова стучало дерево, потом громкий свист, не птица, что-то с большим объемом легких, долго жуткие звуки. Они были сначала на одной стороне лагеря, потом на другой, как будто общались друг с другом. Вожатые решили, что мы все должны оставаться прямо у костра, где они могли бы пересчитать людей, все очень боялись. Нам сказали оставаться в наших спальных мешках вокруг костра, не двигаться и не оставлять спальные мешки. На другом берегу озера в то же время располагался лагерь отряда бойскаутов. Вожатые позвонили через озеро, небольшое озеро, чтобы они подошли и помогли нам. Бойскауты и вожатые так и сделали, сели с нами у костра и слушали непрекращающийся стук, свист и треск. Это была не шутка. Бойскауты испугались так же, как и мы, и решили, что мы не должны уходить до рассвета, потому что было бы слишком опасно идти обратно через лес к машинам. Тогда не было сотовых телефонов, поэтому всем приходилось ждать, пока мы пробежим через лес к машинам и доберемся до телефона, чтобы сообщить об этом. Вожатый бойскаутов сделал это, и полиция штата прибыла, когда мы уехали из парка примерно в 5:30 утра. Моя мать сказала мне, во-первых, что я больше никогда не пойду в поход, а во-вторых, что полиция сказала вожатой девушки-скаута, что они ничего не нашли ни в кемпингах, ни в лесу, спагетти так и не нашли. Тогда вы бы приписали такое происходящее дьяволу из джерси, но в этом случае после всей сегодняшней информации я должен был бы сказать, что это был йети или пара йети, которые просто не хотели, чтобы мы были там. Также не имело смысла думать, что это был человек или люди, которые хотели, чтобы мы ушли оттуда. Если бы человек украл еду, он бы ушел далеко, чтобы его не поймали, уж точно не пугал бы нас так сильно всю ночь напролет. чтобы мы вызвали полицию.

Во-первых, давайте отфильтруем все записи, кроме тех, которые произошли в 2004 году.

Давайте также переформатируем столбец timestamp, чтобы он был просто ГГГГ-ММ-ДД без увеличения времени.

bf_locations = bf_locations.where(bf_locations['timestamp'].dt.year == 2004).dropna(how='all')

Теперь давайте объединим столбец сезона из столбца report_df.

bf_locations['timestamp'] = bf_locations['timestamp'].dt.strftime('%Y-%m-%d')

Вы могли заметить, что мы потеряли 10 строк данных при слиянии. Я вернулся, чтобы проверить это, и оказалось, что в report_df отсутствуют 10 записей в 2004 году. Я проверил правильность номеров отчетов в столбце number. У нас просто будет на 10 записей меньше, что не имеет большого значения.

bf_locations = bf_locations.merge(report_df[['number', 'season']], on='number')

Самый простой способ создать маркеры для каждой точки, основать их цвет в зависимости от сезона, включить заголовок в виде всплывающего окна, а затем использовать год в качестве всплывающей подсказки, - это преобразовать фрейм данных в записи для повторения. Мы также создадим словарь цветов, чтобы сопоставить время года с соответствующим цветом. Это будет весело:

Вы можете запустить это, чтобы лучше понять, чего мы пытаемся достичь:

color_dict = {'Winter': 'blue',
              'Summer': 'red',
              'Spring': 'green',
              'Fall': 'orange',
              'Unknown': 'black'
              }
records = bf_locations[['latitude', 'longitude', 'season', 'title', 'timestamp']].to_records()
records[0]
OUT:
(0, 55.2035, -132.8202, 'Winter', 'Report 7963: Sasquatch walks past window of house at night', '2004-02-09')

Глядя на оператор печати, это, по сути, то, что мы будем делать внутри объекта Marker для каждой записи. Теперь мы будем использовать тот же метод для построения каждого маркера. Маркеры будут иметь цвета, связанные с сезоном наблюдения, всплывающую подсказку с датой наблюдения и всплывающее окно с текстом заголовка наблюдения.

for record in records[:2]:
    print(f"Lat: {record[1]}")
    print(f"Long: {record[2]}")
    print(f"Season Color: color_dict[record[3]]}")
    print(f"Title: {record[4]}")
    print(f"Timestamp: {record[5]}")

И вот оно! Красивая карта, показывающая встречи с снежным человеком по сезонам 2004 года. Какая забава! Если вы используете мобильный телефон, возможно, GIF-файл карты не отобразился. Если это так, проверьте его в своем браузере, когда у вас будет время.

color_dict = {'Winter': 'blue',
              'Summer': 'red',
              'Spring': 'green',
              'Fall': 'orange',
              'Unknown': 'black'
              }
records = bf_locations[['latitude', 'longitude', 'season', 'title', 'timestamp']].to_records()

# This is our map lovingly centered on Dearing Kansas at a 15 zoom
bf_map = folium.Map(location=[37.0902, -95.7129], zoom_start=5)
# Add the markers to the map...
for record in records:
    folium.Marker(location=[record[1], record[2]],
                  icon=folium.Icon(color=color_dict[record[3]],
                                   icon_color='white',
                                   icon='search',
                                   prefix='fa',
                                   ),
                  popup=record[4],
                  tooltip=record[5]
                  ).add_to(bf_map)
# Display the map with the marker that's been added
bf_map

В этой статье вы узнали немного больше о фолиуме. Вы узнали, как разместить несколько маркеров на карте, как изменить цвет этих маркеров, значок и цвет значка, а также как создавать всплывающие подсказки и всплывающие окна для маркеров. Кроме того, вы узнали немного больше о снежном человеке и путешественниках во времени в «Девочках-скаутах», что было бонусом. Как всегда, обращайтесь в комментарии, если у вас есть какие-либо вопросы. Спасибо за прочтение!

Лето: Красный

«Где в мире находится снежный человек?
Анализ данных о снежном человеке с использованием Python и Foliummedium.com»



Больше контента на plainenglish.io



Продолжающиеся поиски снежного человека