全国业务地图可视化

该篇文章介绍了如何利用Python的geopandas和Bokeh库,从GeoJSON和Excel数据中提取中国的省份信息,结合融资金额数据,生成了一个显示各省融资金额分布的交互式地图。
摘要由CSDN通过智能技术生成

import os
import json
import pandas as pd
import geopandas as gpd
from bokeh.models import GeoJSONDataSource, ColorBar, HoverTool
from bokeh.plotting import figure
from bokeh.embed import components
from bokeh.resources import INLINE
import sys
from bokeh.models import ColumnDataSource

def create_bokeh_plot():
    # 获取当前执行文件的目录路径
    if getattr(sys, 'frozen', False):
        # 如果是由PyInstaller打包的EXE,使用这种方式获取路径
        application_path = os.path.dirname(sys.executable)
    else:
        # 如果是直接运行的.py文件,使用这种方式获取路径
        application_path = os.path.dirname(__file__)

    # 构造geojson文件的完整路径
    geojson_path = os.path.join(application_path, '中国地图.geojson')
    # 从当前目录加载GeoJSON数据
    with open(geojson_path, 'r', encoding='utf-8') as f:
        geojson_data = json.load(f)

    # 构造excel文件的完整路径
    excel_path = os.path.join(application_path, '电网数据.xlsx')
    # 从当前目录加载Excel数据
    df = pd.read_excel(excel_path)

    gdf = gpd.GeoDataFrame.from_features(geojson_data['features'])
    gdf['name'] = gdf.apply(lambda row: row['properties']['name'], axis=1)

    # 创建一个包含所有省份的DataFrame,这里假设gdf中省份的列名为'name'
    all_provinces = pd.DataFrame({'省份': gdf['name'].unique()})
    all_provinces['key'] = 1
    # 给原始客户数据添加同样的'key'列,用于外连接
    df['key'] = 1

    # 外连接,确保所有省份都被包含
    full_df = pd.merge(all_provinces, df, on='省份', how='left').fillna({'客户数量': 0, '融资金额': 0})
    # 将客户数据与GeoDataFrame合并
    combined_gdf = gdf.merge(full_df, left_on='name', right_on='省份')

    # 定义融资金额的分类边界
    bins = [-1, 0, 10_000_000, 100_000_000, 500_000_000, float('inf')]
    categories = ['0', '1-10M', '10M-100M', '100M-500M', '>500M']

    # 分类融资金额
    combined_gdf['financing_category'] = pd.cut(combined_gdf['融资金额'], bins, labels=categories)

    # 定义每个分类的颜色
    color_dict = {
        '0': '#d9d9d9',  # 灰色
        '1-10M': '#bae4b3',  # 浅绿
        '10M-100M': '#74c476',  # 中绿
        '100M-500M': '#31a354',  # 深绿
        '>500M': '#006d2c'  # 碧绿
    }
    combined_gdf['color'] = combined_gdf['financing_category'].map(color_dict)

    # 转换为GeoJSONDataSource
    geo_source = GeoJSONDataSource(geojson=combined_gdf.to_json())

    # 创建图形
    p = figure(title="中国融资金额分布", width=800, height=600, sizing_mode="scale_width")
    p.patches('xs', 'ys', source=geo_source,
              fill_color='color',
              line_color='black', line_width=0.25, fill_alpha=1)

    # 添加HoverTool
    hover = HoverTool()
    hover.tooltips = [("省份", "@name"), ("融资金额", "@融资金额{0,0}元")]
    p.add_tools(hover)

    # 输出HTML并返回script和div
    script, div = components(p, INLINE)

    return script, div

# 这里直接调用 create_bokeh_plot 函数并打印结果,实际使用时可以根据需要进行调整
script, div = create_bokeh_plot()
print(script)
print(div)
 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值