使用EOMAPS的地理数据可视化和分析:Python中的交互式图!
#开源 #python #datascience #visualization

本文是关于EOmaps:一个python软件包,可帮助您使用几行代码创建美丽的互动地图。

它提供了许多有用的工具创建出版物Ready Maps ,并允许您使用交互式geo-data分析的地图

主要功能是:

  • 全面创建高度定制地图的综合Python API
  • 一个用于交互性比较,分析和编辑地图的GUI-WIDGET
  • 可视化(可能很大)数据集的功能
  • 使用地图进行交互式数据分析的工具
  • 广泛的documentation

与您最喜欢的IDE,在Jupyter Notebookscommand line tool中使用它!

以下各节提供了有关EOMAPS的基本功能的快速概述。我们不会详细介绍,而只需探索可能的事情并创建一些示例地图!

基本概念 - 让我们创建一个地图!

eomaps全都与Maps对象有关。
要启动新地图,我们创建一个名为mMaps对象。

这将初始化一个新的matplotlib.Figure和一个cartopy.GeoAxes的地图。

from eomaps import Maps
m = Maps()
m.add_feature.preset("coastline", "ocean")

A very basic EOmaps map.

Maps对象m现在可用于添加功能,绘图数据集或添加回调以与地图进行交互。

地图预测

默认情况下,该地图将在PlateCarree投影(例如LON/LAT)中。要在不同的投影中创建地图,您可以使用 epsg - 编码或任何cartopy projection

添加自定义功能,例如海岸线,海洋着色等

from eomaps import Maps
m = Maps(crs=Maps.CRS.Mollweide())
m.add_feature.physical.ocean(scale=110, fc="darkslategrey")
m.add_feature.physical.land(scale=110, fc="sienna")
m.add_feature.cultural.admin_0_countries(scale=110, fc="none", ec=(0.9, 0.8, 0.75), lw=0.5)

A map in Mollweide-projection


eomaps提供了许多其他功能来自定义地图的外观。由于有关功能的完整概述将超出本文的范围,因此请确保查看documentation以获取更详细的概述!

为可能性提供一个快速的例子,这是您可以创建包括 Gridlines scalebar 的下面的地图>,a 徽标,一些文本和从 WebMap服务获取的图像

A map showcasing some of the features available with EOmaps.

from eomaps import Maps
m = Maps(crs=3035, figsize=(7, 5))

# add some features, a compass, a scalebar and a logo
m.add_feature.physical.ocean(scale=50, fc=".5")
m.add_feature.physical.coastline(scale=50, fc="none", ec="k", lw=1)

m.add_compass(pos=(0.1, 0.1))
m.add_scalebar(pos=(-39, 36), scale=2e5, preset="bw", size_factor=1.8)
m.add_logo()

# add grid lines with bold labels
g = m.add_gridlines(45)
g.add_labels(fontsize=8, fontweight="bold")

# add a watercolor basemap provided by: maps.stamen.com
m.add_wms.OpenStreetMap.add_layer.stamen_watercolor()

# write some info-text below the axes
m.text(0.75, -0.02,
       "data provided by: naturalearthdata.com, maps.stamen.com/watercolor",
       fontsize=6, transform=m.ax.transAxes)

数据可视化

现在,我们已经了解了如何创建不错的基础图,它的时间是进行一些数据可视化的时间!

EOMAPS可用于可视化(可能很大)数据集。它处理数据的重新注射和分类,并提供以下方法来表示地图上的1D或2D数据:

  • 绘制投影多边形每个数据点:
    • 椭圆/矩形(在给定投影中定义的半径)
    • 地球圆(以米定义的半径)
  • 为每个数据点绘制标记
  • 绘制 voronoi图 delaunay三角剖分
  • 绘制(可能很大)2D数据集作为矩形栅格
  • 使用数据阴影 1D和2D数据集可视化非常大的数据集。

在文档的“ Data Visualization”部分中给出了有关如何可视化数据集的详细概述。

目前,让我们快速查看代码,以创建图像集在地球仪上绘制的数据集和一个突出显示所选区域的插图:

A map showing some data and an [inset-map](https://eomaps.readthedocs.io/en/latest/api_inset_maps.html) to highlight a specific area on the map

# create some random data
import numpy as np
x, y = np.linspace(-10, 10, 100), np.linspace(-20, 70, 200)
x, y = np.meshgrid(x, y)
data = np.sqrt(x**4 + y**2 + np.random.randint(0, 2e3, x.shape))
from eomaps import Maps

# create a map
m = Maps(Maps.CRS.Orthographic(45, 45))
m.add_feature.preset("coastline", "ocean")
m.add_gridlines(20)

# plot the data
m.set_data(data, x, y, crs=4326)             # assign the data
m.set_classify.NaturalBreaks(k=5)            # classify the data
m.set_shape.raster()                         # set the shape
m.plot_map(cmap="RdYlBu", set_extent=False)  # plot the data

# add a colorbar
cb = m.add_colorbar()
cb.set_labels("values: $\\sqrt{x^4 + y^2 + random}$",
              "hist. count", fontweight="bold")

# create a new inset-map to highlight a specific region
m_inset = m.new_inset_map(xy=(5, 45), radius=15)
m_inset.add_extent_indicator(lw=3)
m_inset.add_indicator_line()

m_inset.add_feature.preset("coastline", "ocean")
m_inset.add_gridlines(([0, 10], [50, 40]), lw=2, labels=True)
m_inset.add_gridlines(2.5, lw=0.3)

# plot the same data as before on the inset-map
m_inset.inherit_data(m)             # inherit the data
m_inset.inherit_classification(m)   # inherit the classification
m_inset.set_shape.ellipses()        # use a different shape
m_inset.plot_map()                  # plot the data

# re-arrange the axes with respect to a given layout
# >>> checkout the LayoutEditor!
m.apply_layout(
    {'figsize': [6.4, 4.8],
     '0_map': [0.025, 0.45, 0.4, 0.5],
     '1_cb': [0.01, 0.05, 0.98, 0.25],
     '1_cb_histogram_size': 0.8,
     '2_inset_map': [0.5, 0.35, 0.42, 0.55]}
    )

层管理

使用eomaps,一个图可以具有您喜欢的

这对于:

真的很有用
  • 彼此比较多个数据集
  • 快速检查OpenStreetMap或一些卫星图像,以更广泛地了解正在发生的事情

以下图像说明了如何创建和管理多个情节层。简而言之:

  • 使用m_A = m.new_layer("layer A")创建一个新图层
  • 现在,您可以使用我们到目前为止所学到的所有内容,通过使用关联的Maps对象m_A

EOmaps layer management

伴侣小部件

现在,我们知道了如何创建(多层)映射并可视化数据集的一些基础知识,现在该引入Companion Widget的时候了 - 一个不错的小图形用户界面,允许您与您进行交互图并在许多方面探索EOMAPS的功能:

  • 比较图层< / strong>:创建 /开关 /覆盖< / li>
  • 添加功能:天然性,网络图等
  • 绘图文件:拖放Geotiff,NetCDF,CSV和Shape Files
  • 绘制形状:在地图上绘制和导出地理编码多边形
  • 添加/编辑注释:将文本指示器添加到地图
  • 导出图像:自定义图形导出(PNG,JPEG,SVG ...)

EOmaps

激活小部件,在鼠标位于EOMAPS映射的顶部时,在键盘上按w

获取有关按钮/滑块等的信息。单击信息按钮!
?

Using the companion widget.

数据分析

最后,让我们探索如何将地图用作交互式数据分析小部件!

要与地图互动,您可以附加回调功能在以下事件之一上触发:

  • 一般事件:

    • 单击:您在地图上的任何地方单击了鼠标。
    • 移动:您将鼠标移到地图上。
    • 按键:键盘上按下键。
  • 与数据集关联的事件:

    • pick :如果单击地图,EOMAPS将标识最近的数据点,并提供基本属性(ID,位置,值,...)作为回调的参数。

有许多pre-defined回调,但是您当然也可以定义custom callbacks并将其连接到地图上。

作为一个快速示例,让我们使用以下单击并选择回调:

创建一个地图:

  • 左键单击:显示标记和基本注释
  • 右键单击:识别最接近的数据点,用黑色边界指示点,显示自定义注释并执行自定义回调

Using Callbacks

from eomaps import Maps
m = Maps(3035)
m.add_title("Circles with 10° radius.")
m.add_feature.preset("coastline", "ocean")
m.add_logo(pad=(0, 0.2), size=0.2)

m.set_data(data=[1, 2, 3], x=[-47, -6, 63], y=[56, 46, 61], crs=4326)
m.set_shape.ellipses(radius=10, radius_crs=4326)
m.plot_map()

# Attach CLICK callbacks on RIGHT click (button 3)
m.cb.click.attach.annotate(button=3, fontsize=8, xytext=(-30,-70))
m.cb.click.attach.mark(button=3, radius=1, radius_crs=4326, fc="r")

# Attach PICK callbacks on LEFT click (the default)
m.cb.pick.attach.mark(ec="k", fc="none", lw=3, n=100)

def my_text(ID, **kwargs):
    return f"Datapoint {ID}"

m.cb.pick.attach.annotate(
    text=my_text, 
    xytext=(0.5, .9), 
    textcoords="axes fraction",
    fontsize=20, 
    horizontalalignment="center", 
    bbox=dict(lw=3),
    arrowprops=dict(
        arrowstyle="fancy", 
        fc="k", 
        connectionstyle="Angle3"
        )
    )

def my_callback(ID, pos, val, **kwargs):
    print(f"\nFound datapoint {ID}:\n"
          f" xy (plot): {pos}\n"
          f" xy (data): ({m.data_specs.x[ID]}, {m.data_specs.y[ID]})\n"
          f" value:     {val}\n")

m.cb.pick.attach(my_callback)

结论

这样,我们已经完成了有关EOMAPS的基本功能的快速巡回演出... explore还有很多事情!

尝试一下!

注意: eomaps是一个免费的open source Python模块,需要大量的时间和精力来维持。

  • 发现EOMAPS有用吗?支持开发!
    • 传播!
    • 向您的出版物添加citation
  • 有兴趣为EOMAPS做出贡献吗?