Python Geoplotlib 可视化地理数据的综合指南

Geoplotlib: Exploring the World with Python

Python Geoplotlib 可视化地理数据的综合指南

Geoplotlib是一个强大的Python库,用于可视化地理数据。它提供了一种简单直观的方法来创建地图并在其上绘制地理数据。

Geoplotlib 建立在 matplotlib 和 numpy 之上。它旨在使创建地图和在其上绘制数据变得容易。

Geoplotlib 提供了一个简单的界面,用于创建具有各种投影的地图,包括墨卡托、埃克特和哈默。

Geoplotlib支持多种数据格式,包括CSVGeoJSONShapefiles

它还为各种数据可视化提供内置支持,包括热图、choropleths 和动画。

主要特点 Geoplotlib提供了许多功能,使其成为可视化地理数据的强大工具。

易于使用:Geoplotlib 对于创建地图和在其上绘制数据非常简单。您无需成为 matplotlib 或 numpy 方面的专家即可使用 geoplotlib。

多重投影:Geoplotlib 支持各种地图投影,包括墨卡托、埃克特和哈默。这样可以轻松创建根据您的特定需求量身定制的地图。

内置数据可视化:Geoplotlib 为各种数据可视化提供内置支持,包括热图、choropleths 和动画。这样可以轻松浏览数据并深入了解其模式和趋势。

可扩展性:Geoplotlib 设计为可扩展,这意味着您可以对其进行自定义以满足您的特定需求。您可以创建自己的投影、数据可视化,甚至可以将其与其他库(如 D3.js)结合使用。

开源:Geoplotlib是一个开源库,这意味着您可以免费使用它并为它的发展做出贡献。

开始使用 Geoplotlib

让我们首先安装它及其依赖项。Geoplotlib 需要 scipy、numpy 和 matplotlib,因此请确保在安装 geoplotlib 之前已安装它们。

您可以使用 python 包安装程序 pip 安装 geoplotlib:

pip install geoplotlib

在 anaconda 环境中,您可以使用 conda 在 conda 提示符下安装命令:

conda install -c conda-forge geoplotlib

不同类型的可视化 点图(点图)

点图或点图用于在地图上绘制单个数据点。这对于可视化城市、地标或事件的位置等数据非常有用。

在此示例中,我们将绘制总线.csv文件中提供的位置。下面给出了数据示例:


+========================================+==================+==================+
|                  name                  |       lat        |       lon        |
+========================================+==================+==================+
| Rådhuspassagen                         | 55.7439334696163 | 12.4939206032287 |
+----------------------------------------+------------------+------------------+
| Fortvej (Rødovre)                      | 55.6952237184886 |   12.44859262751 |
+----------------------------------------+------------------+------------------+
| Amagerhallen                           | 55.6231253495358 | 12.6144437338954 |
+----------------------------------------+------------------+------------------+
| Københavns Lufthavn Kastrup (fjernbus) | 55.6292273994335 | 12.6458240910507 |
+----------------------------------------+------------------+------------------+
| Valby mod Kastrup (fjernbus)           | 55.6635187158974 | 12.5157589902864 |
+----------------------------------------+------------------+------------------+
| Roskilde Trekroner st (fjernbus)       | 55.6483457671695 | 12.1319156347238 |
+----------------------------------------+------------------+------------------+
| Holbæk mod kbh. (fjernbus)             | 55.7092499829538 | 11.6434932796666 |
+----------------------------------------+------------------+------------------+

代码 snippet

import geoplotlib
from geoplotlib.utils import read_csv

# load the data
data = read_csv('bus.csv')

# create a map
geoplotlib.dot(data)
geoplotlib.show()

使用地理图库的点图示例

Python Geoplotlib 可视化地理数据的综合指南_第1张图片

热图

热图用于在地图上显示数据点的密度。这对于可视化特定区域中事件或活动的集中度非常有用。

在此示例中,我们将绘制印度按地区划分的人口热图。

下面给出了数据示例:

+================+===============+=============+=============+====================+====================+
|     State      |   District    |     lat     |     lon     | Population in 2001 | Population in 2011 |
+================+===============+=============+=============+====================+====================+
| Andhra Pradesh | Anantapur     | 14.31206556 | 77.46015845 |            3640478 |            4081148 |
+----------------+---------------+-------------+-------------+--------------------+--------------------+
| Andhra Pradesh | Chittoor      | 13.33109263 | 78.92763899 |            3745875 |            4174064 |
+----------------+---------------+-------------+-------------+--------------------+--------------------+
| Andhra Pradesh | East Godavari | 16.78271832 | 82.24320747 |            4901420 |            5154296 |
+----------------+---------------+-------------+-------------+--------------------+--------------------+
| Andhra Pradesh | Guntur        | 15.88492577 | 80.58657614 |            4465144 |            4887813 |
+----------------+---------------+-------------+-------------+--------------------+--------------------+
| Andhra Pradesh | Krishna       | 16.14387275 | 81.14805061 |            4187841 |            4517398 |
+----------------+---------------+-------------+-------------+--------------------+--------------------+
| Andhra Pradesh | Kurnool       | 15.43759715 | 77.90086837 |            3529494 |            4053463 |
+----------------+---------------+-------------+-------------+--------------------+--------------------+
| Andhra Pradesh | Prakasam      |   15.489039 |  80.1166579 |            3059423 |            3397448 |
+----------------+---------------+-------------+-------------+--------------------+--------------------+
Python Geoplotlib 可视化地理数据的综合指南_第2张图片

使用地理图库的热图图示例

import geoplotlib
from geoplotlib.utils import read_csv, BoundingBox, DataAccessObject
import pandas as pd

# load the data
df = pd.read_csv('district wise population and centroids.csv')

# rename the columns
df.columns = ['State''District''lat''lon''Population in 2001''Population in 2011']

# Kernal Density Estimation
geoplotlib.kde(df, bw=6,cut_below=1e-5)

# create a map
geoplotlib.set_bbox(BoundingBox.KBH)
geoplotlib.show()

直方图(二维直方图)

在此示例中,我们将根据丹麦手机信号塔位置的数据生成直方图。下面给出了数据示例:

+====================+====================+
|        lon         |        lat         |
+====================+====================+
|   11.3536345358484 | 55.396806865594705 |
+--------------------+--------------------+
| 11.353636424000001 |       55.396854538 |
+--------------------+--------------------+
| 12.440447906745947 |  55.66927299820733 |
+--------------------+--------------------+
|   9.90203947203555 |    57.054188101033 |
+--------------------+--------------------+
| 12.287274532822275 | 55.942241224369134 |
+--------------------+--------------------+
| 12.264405121010098 |   55.9143449747863 |
+--------------------+--------------------+
|   8.64744152873755 |   56.3463091151789 |
+--------------------+--------------------+
Python Geoplotlib 可视化地理数据的综合指南_第3张图片
import geoplotlib
from geoplotlib.utils import read_csv, BoundingBox

# load the data
data = read_csv('opencellid_dk.csv')

# hitogram
geoplotlib.hist(data, colorscale='sqrt', binsize=8)

# create a map
geoplotlib.set_bbox(BoundingBox.DK)
geoplotlib.show()

空间图

空间图是一种特殊类型的图,其中节点具有明确定义的空间配置。

这些类型的图表对于显示运输网络譬如公交路线、火车轨道、飞行路径、供应链网络、电话网络和通勤网络等非常有用。

在此示例中,我们将生成机场位置的空间图,其中每个节点表示一个机场,每个边表示一个航班连接。

下面给出的数据示例:

+===============+===============+=============+=============+
| lon_departure | lat_departure | lon_arrival | lat_arrival |
+===============+===============+=============+=============+
|        61.838 |        55.509 |       38.51 |      55.681 |
+---------------+---------------+-------------+-------------+
|        61.838 |        55.509 |      49.464 |       56.01 |
+---------------+---------------+-------------+-------------+
|        61.838 |        55.509 |      83.084 |      55.021 |
+---------------+---------------+-------------+-------------+
|         38.51 |        55.681 |      61.838 |      55.509 |
+---------------+---------------+-------------+-------------+
|         38.51 |        55.681 |      20.987 |      55.483 |
+---------------+---------------+-------------+-------------+
|         38.51 |        55.681 |      49.464 |       56.01 |
+---------------+---------------+-------------+-------------+

输出效果:

Python Geoplotlib 可视化地理数据的综合指南_第4张图片

使用地理图库的空间图示例

import geoplotlib
from geoplotlib.utils import read_csv

# load the data
data = read_csv('flights.csv')

# create a map
geoplotlib.graph(data,
                 src_lat='lat_departure',
                 src_lon='lon_departure',
                 dest_lat='lat_arrival',
                 dest_lon='lon_arrival',
                 color='hot_r',
                 alpha=15,
                 linewidth=1)

geoplotlib.show()

分区统计

分区统计是彩色或阴影区域表示属性量级的地图。分区统计图用于在地图上显示特定变量的分布或密度。

这对于可视化人口或经济数据非常有用。

在这个例子中,我们将在美国生成失业的分区统计。

使用geoplotlib的分区统计图示例

import geoplotlib
from geoplotlib.utils import BoundingBox
from geoplotlib.colors import ColorMap
import json


# find the unemployment rate for the selected county, and convert it to color
def get_color(properties):
    key = str(int(properties['STATE'])) + properties['COUNTY']
    if key in unemployment:
        return cmap.to_color(unemployment.get(key), .15, 'lin')
    else:
        return [0, 0, 0, 0]


with open('unemployment.json') as fin:
    unemployment = json.load(fin)

cmap = ColorMap('Blues', alpha=255, levels=10)
geoplotlib.geojson('gz_2010_us_050_00_20m.json', fill=True, color=get_color, f_tooltip=lambda properties: properties['NAME'])
geoplotlib.geojson('gz_2010_us_050_00_20m.json', fill=False, color=[255, 255, 255, 64])
geoplotlib.set_bbox(BoundingBox.USA)
geoplotlib.show()

移动点(动画可视化)

geoplotlib最酷的功能是生成动画绘图的能力。在此示例中,让我们跟踪动画移动点图中的出租车移动。下面给出了数据示例:

+=========+=============+=============+============+
| taxi_id |     lon     |     lat     | timestamp  |
+=========+=============+=============+============+
|     366 | 116.4495033 | 39.80616333 | 1202374816 |
+---------+-------------+-------------+------------+
|     366 |   116.44952 |    39.80624 | 1202374846 |
+---------+-------------+-------------+------------+
|     366 | 116.4495233 | 39.80623333 | 1202374876 |
+---------+-------------+-------------+------------+
|     366 |   116.44952 |    39.80623 | 1202374906 |
+---------+-------------+-------------+------------+
|     366 | 116.4495267 | 39.80622167 | 1202374936 |
+---------+-------------+-------------+------------+
|     366 |   116.44952 |    39.80622 | 1202374966 |
+---------+-------------+-------------+------------+

使用 geoplotlib 绘制动画移动点图的示例

from geoplotlib.layers import BaseLayer
from geoplotlib.core import BatchPainter
import geoplotlib
from geoplotlib.colors import colorbrewer
from geoplotlib.utils import epoch_to_str, BoundingBox, read_csv


class TrailsLayer(BaseLayer):

    def __init__(self):
        self.data = read_csv('taxi.csv')
        self.cmap = colorbrewer(self.data['taxi_id'], alpha=220)
        self.t = self.data['timestamp'].min()
        self.painter = BatchPainter()


    def draw(self, proj, mouse_x, mouse_y, ui_manager):
        self.painter = BatchPainter()
        df = self.data.where((self.data['timestamp'] > self.t) & (self.data['timestamp'] <= self.t + 15*60))

        for taxi_id in set(df['taxi_id']):
            grp = df.where(df['taxi_id'] == taxi_id)
            self.painter.set_color(self.cmap[taxi_id])
            x, y = proj.lonlat_to_screen(grp['lon'], grp['lat'])
            self.painter.points(x, y, 10)

        self.t += 2*60

        if self.t > self.data['timestamp'].max():
            self.t = self.data['timestamp'].min()

        self.painter.batch_draw()
        ui_manager.info(epoch_to_str(self.t))


    def bbox(self):
        return BoundingBox(north=40.110222, west=115.924463, south=39.705711, east=116.803369)

geoplotlib.add_layer(TrailsLayer())
geoplotlib.show()

试试吧,这是我在Python中看到的最酷的效果之一!

数据来源:人口数据、其他文件。

本文由 mdnice 多平台发布

你可能感兴趣的:(后端)