Python 绘制北上广深的地铁路线动态图

下面是详细讲解“Python 绘制北上广深的地铁路线动态图”的完整攻略。

1.准备工作

1.1 安装相关库

首先,我们需要安装几个相关的库,包括 matplotlibPillowrequests,以及xlrdopenpyxl。可以使用以下命令来进行安装:

pip install matplotlib pillow requests xlrd openpyxl

1.2 获取地铁数据

在绘制地铁路线动态图之前,我们需要获得相应的地铁数据。可以通过各种渠道获得,例如从国家或城市统计局、地铁官网或其他公开数据平台获取。此处我们以北京地铁为例,我们可以在 https://www.bjsubway.com/station/zjgls/# 获取到相应的数据。我们选择把数据保存在Excel中。

2.绘制地铁路线图

2.1 获取站点信息

首先,我们需要获取各个地铁站点的信息,包括站名、线路名、经纬度等。我们可以将这些信息保存在Excel文件中,方便后续使用。可以使用以下代码获取站点信息并保存到Excel文件中:

import requests
import xlrd
import xlwt
from xlutils.copy import copy
import time

# 获取地铁线路信息
def get_lines_info():
    url = 'https://www.bjsubway.com/station/zjgls/#'
    headers = {
        'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36'}
    response = requests.get(url, headers=headers)
    response.encoding = 'gbk'

2.2 绘制地铁路线图

在获取站点信息之后,我们可以开始绘制地铁路线图。首先,我们需要将每一条地铁线路的站点连起来,形成一条曲线。这可以使用matplotlib库中的plot函数来实现。具体来说,我们可以定义一个绘制地铁线路的函数,使用plot函数绘制站点之间的曲线。

import matplotlib.pyplot as plt

def draw_subway_lines(subway_data, filename):
    fig, ax = plt.subplots(figsize=(8, 8))
    ax.set_aspect('equal')
    ax.set_xticks([])
    ax.set_yticks([])

    lines = list(subway_data.keys())

    for line in lines:
        # 逐条线路绘制
        stations = subway_data[line]['stations']

        x_list = []
        y_list = []

        for i in range(len(stations)):
            station = stations[i]
            station_name = station[0]

            if station_name not in stations_locations:
                continue

            location = stations_locations[station_name]
            x_list.append(location['longitude'])
            y_list.append(location['latitude'])

            ax.annotate(station_name, (location['longitude'], location['latitude']))   # 显示车站名称

        ax.plot(x_list, y_list, color=subway_data[line]['color'], alpha=0.8)

    plt.savefig(filename, dpi=300)
    plt.show()

2.3 获取车站坐标信息

在将车站连线绘制出来之后,我们需要将车站的名称和经纬度对应起来,方便后续使用。我们可以从爬虫中获得车站的坐标,同时可以手动添加其他缺失的站点信息。具体来说,我们可以从Excel文件中读取车站信息,将车站名称和坐标存储到字典stations_locations中。

# 加载车站信息
def load_stations_info(filename):
    stations_locations = {}

    with xlrd.open_workbook(filename) as workbook:
        for sheetname in workbook.sheet_names():
            sheet = workbook.sheet_by_name(sheetname)

            for row in range(1, sheet.nrows):  
                station_name = sheet.cell_value(row, 0)  
                longitude = float(sheet.cell_value(row, 2))  
                latitude = float(sheet.cell_value(row, 3))  

                stations_locations[station_name] = {'longitude': longitude, 'latitude': latitude}

    return stations_locations

3.绘制动态图

最后,我们可以将多张静态图片合成一张动态图,以便更好地展现地铁线路的变化。我们可以使用Pillow库中的ImageSequence类进行动态图的处理。具体来说,我们可以定义一个生成地铁路线动态图的函数generate_gif,使用ImageSequence类读取并合并多张静态图片,生成一张包含所有图片的动态图。

import os
from PIL import Image, ImageSequence

def generate_gif(image_files, output_gif):
    images = []
    for filename in image_files:
        images.append(Image.open(filename))

    images[0].save(output_gif, save_all=True, append_images=images[1:], optimize=False, duration=500, loop=0)

接下来是一个完整的示例,生成北京地铁路线的动态图:

import requests
import xlrd
import xlwt
from xlutils.copy import copy
import time
import matplotlib.pyplot as plt
from PIL import Image, ImageSequence

def get_lines_info():
    url = 'https://www.bjsubway.com/station/zjgls/#'
    headers = {
        'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36'}
    response = requests.get(url, headers=headers)
    response.encoding = 'gbk'

    # 获取地铁线路信息
    subway_data = {}
    tags = response.text.split('<a class="title"')
    for tag in tags:
        if tag.find('线</a>') == -1:
            continue

        color_pos = tag.find('background-color:')
        if color_pos == -1:
            continue
        color_start = color_pos + len('background-color:#')
        color_end = tag.find(';"><', color_start)
        color = '#' + tag[color_start:color_end]
        line_info = tag.split('class="station">')

        stations = []
        for station_info in line_info:
            if station_info.find('站</a>') == -1:
                continue

            station_start = station_info.find('">') + len('">')
            station_end = station_info.find('</a>', station_start)
            station_name = station_info[station_start:station_end]
            stations.append((station_name, color))

        line_name = line_info[0].split('">')[1].split('线')[0]
        subway_data[line_name] = {'color': color, 'stations': stations}

    return subway_data

def draw_subway_lines(subway_data, stations_locations, filename):
    fig, ax = plt.subplots(figsize=(8, 8))
    ax.set_aspect('equal')
    ax.set_xticks([])
    ax.set_yticks([])

    lines = list(subway_data.keys())

    for line in lines:
        # 逐条线路绘制
        stations = subway_data[line]['stations']

        x_list = []
        y_list = []

        for i in range(len(stations)):
            station = stations[i]
            station_name = station[0]

            if station_name not in stations_locations:
                continue

            location = stations_locations[station_name]
            x_list.append(location['longitude'])
            y_list.append(location['latitude'])

            ax.annotate(station_name, (location['longitude'], location['latitude']))   # 显示车站名称

        ax.plot(x_list, y_list, color=subway_data[line]['color'], alpha=0.8)

    plt.savefig(filename, dpi=300)
    plt.show()

def load_stations_info(filename):
    stations_locations = {}

    with xlrd.open_workbook(filename) as workbook:
        for sheetname in workbook.sheet_names():
            sheet = workbook.sheet_by_name(sheetname)

            for row in range(1, sheet.nrows):  
                station_name = sheet.cell_value(row, 0)  
                longitude = float(sheet.cell_value(row, 2))  
                latitude = float(sheet.cell_value(row, 3))  

                stations_locations[station_name] = {'longitude': longitude, 'latitude': latitude}

    return stations_locations

def generate_gif(image_files, output_gif):
    images = []
    for filename in image_files:
        images.append(Image.open(filename))

    images[0].save(output_gif, save_all=True, append_images=images[1:], optimize=False, duration=500, loop=0)

if __name__ == '__main__':
    # 1.准备工作

    ## 1.1 安装相关库
    # pip install matplotlib pillow requests xlrd openpyxl

    ## 1.2 获取地铁数据
    subway_data = get_lines_info()

    # 2.绘制地铁路线图

    ## 2.1 获取站点信息
    filename = 'stations.xlsx'
    stations_locations = load_stations_info(filename)

    ## 2.2 绘制地铁路线图
    image_files = []
    for line in subway_data:
        filename = f"{line}.png"
        draw_subway_lines({line: subway_data[line]}, stations_locations, filename)
        image_files.append(filename)

    ## 2.3 获取车站坐标信息

    # 3.绘制动态图
    output_gif = 'subway.gif'
    generate_gif(image_files, output_gif)

以上是一个完整的示例,生成北京地铁路线的动态图。类似的方法也可以用于绘制其他城市的地铁路线图。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Python 绘制北上广深的地铁路线动态图 - Python技术站

(0)
上一篇 2023年6月3日
下一篇 2023年6月3日

相关文章

  • Python 第三方库 openpyxl 的安装过程

    安装Python第三方库openpyxl是非常简单的,下面是详细的安装过程。 1. 安装Python 如果您还没有安装Python,需要先安装Python。可以通过官网下载Python的安装文件,然后安装即可。 2. 安装pip pip是Python的包管理工具,打开终端或命令提示符,使用以下命令安装pip: curl https://bootstrap.p…

    python 2023年5月14日
    00
  • python 爬虫网页登陆的简单实现

    下面是关于“python 爬虫网页登陆的简单实现”的完整攻略: 1. 背景介绍 爬虫一般需要模拟登陆才能爬取需要登录后才能获取的信息,例如淘宝、京东等电商类网站。Python作为一门较为流行的语言之一,它提供了许多优秀的库和模块用于爬虫操作,其中最为著名的是requests模块。本文将以requests模块为例,介绍如何利用Python实现网页登陆。 2. …

    python 2023年5月14日
    00
  • 详解pandas的外部数据导入与常用方法

    我可以为您讲解一下“详解pandas的外部数据导入与常用方法”的完整实例教程。以下是教程的详细内容: 详解pandas的外部数据导入与常用方法 导入pandas模块和数据文件 在运行本教程之前,我们需要先安装pandas模块。可以通过pip安装: pip install pandas 安装完成后,我们需要导入pandas模块,并加载本次教程所需的数据文件。 …

    python 2023年5月13日
    00
  • python处理中文编码和判断编码示例

    下面我将详细讲解一下“Python处理中文编码和判断编码”的攻略。该攻略包括以下几个部分: 中文编码概述 Python中关于中文编码的几个重要库 Python处理中文编码的示例 Python判断中文编码的示例 一、中文编码概述 中文编码是将中文字符转换为计算机能够读取的二进制形式的过程。常见的中文编码有GB2312、GBK、GB18030、UTF-8等。其中…

    python 2023年5月20日
    00
  • windows上安装python3教程以及环境变量配置详解

    Windows上安装Python3教程 Python是一种通用编程语言,拥有强大而简单易用的特性,广泛用于科学计算、Web开发、人工智能等领域。本教程将介绍在Windows上安装Python3以及环境变量配置的详细步骤。 下载Python3 我们可以从Python官网下载最新版本的Python3。在下载页面(https://www.python.org/do…

    python 2023年5月30日
    00
  • Python中函数的创建及调用

    Python中函数的创建及调用涉及到以下几个方面的知识点: 定义函数 (Function Definition) 调用函数 (Function Call) 函数参数 (Function Parameters) 函数返回值 (Function Return Value) 下面分别对上述知识点进行详细讲解。 1. 定义函数 在Python中,定义一个函数使用关键…

    python 2023年6月5日
    00
  • Python数据库的连接实现方法与注意事项

    Python是一种高级语言,能够很好地支持许多数据库,如MySQL、Oracle、MongoDB等,Python可以使用标准库中的sqlite3连接SQLite3数据库,也可以使用第三方库如pymysql、psycopg2连接MySQL、PostgreSQL等数据库。 连接MySQL数据库的示例: 1.安装pymysql pip install PyMySQ…

    python 2023年5月20日
    00
  • Python中X[:,0]和X[:,1]的用法

    在Python中,一般使用numpy库进行数据分析和处理。numpy库提供了多种方法对数组进行操作,如X[:,0]和X[:,1]等方法。 X[:,0]和X[:,1]表示numpy数组X中的所有行的第0列和第1列。例如,如果有一个二维的numpy数组X: import numpy as np X = np.array([[1,2,3],[4,5,6],[7,8…

    python 2023年6月6日
    00
合作推广
合作推广
分享本页
返回顶部