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)