Geoplotlib: Exploring the World with Python
Python Geoplotlib 可视化地理数据的综合指南
Geoplotlib是一个强大的Python库,用于可视化地理数据。它提供了一种简单直观的方法来创建地图并在其上绘制地理数据。
Geoplotlib 建立在 matplotlib 和 numpy 之上。它旨在使创建地图和在其上绘制数据变得容易。
Geoplotlib 提供了一个简单的界面,用于创建具有各种投影的地图,包括墨卡托、埃克特和哈默。
Geoplotlib支持多种数据格式,包括CSV
,GeoJSON
和Shapefiles
。
它还为各种数据可视化提供内置支持,包括热图、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()
使用地理图库的点图示例
热图
热图用于在地图上显示数据点的密度。这对于可视化特定区域中事件或活动的集中度非常有用。
在此示例中,我们将绘制印度按地区划分的人口热图。
下面给出了数据示例:
+================+===============+=============+=============+====================+====================+
| 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 |
+----------------+---------------+-------------+-------------+--------------------+--------------------+
使用地理图库的热图图示例
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 |
+--------------------+--------------------+
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 |
+---------------+---------------+-------------+-------------+
输出效果:
使用地理图库的空间图示例
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 多平台发布