使用pyecharts绘制中国地图
pyecharts 是一个基于 ECharts 的 Python 数据可视化库,ECharts 是一个使用 JavaScript 实现的开源可视化库,而 Pyecharts 则是 ECharts 的 Python 封装,使得在 Python 中使用 ECharts 变得更加方便。
作为Python又一款可视化的利器,它有着非常丰富的功能。今天我们主要关注使用pyecharts绘制中国地图
在我们使用前,需要在当前的Python环境下安装pyecharts的库
pip install pyecharts
需要注意,自从 v0.3.2 开始,为了缩减项目本身的体积以及维持 pyecharts 项目的轻量化运行,pyecharts 将不再自带地图 js 文件。
为了绘制地图,还要单独安装对应的地图文件包
# 全球国家地图:世界地图和 213 个国家,包括中国地图
pip install echarts-countries-pypkg
# 中国省级地图:
pip install echarts-china-provinces-pypkg
# 中国地级市地图:
pip install echarts-china-cities-pypkg
# 中国县级地图:
pip install echarts-china-counties-pypkg
# 中国区域地图:
pip install echarts-china-misc-pypkg
大家可以根据自己的需求进行对应下载
下面我们开始正式绘制地图
from pyecharts import options as opts from pyecharts.charts import Map # 准备数据(假数据,绘制中不显示,仅作为传参功能) provinces = ["北京", "上海", "广东", "江苏", "浙江", "四川", "湖北", "湖南", "河南", "山东"] values = [100, 90, 80, 70, 60, 50, 40, 30, 20, 10] # 将数据转换为Pyecharts需要的格式 data = list(zip(provinces, values)) # area = "china" # 创建地图对象 china_map = ( Map(init_opts=opts.InitOpts( width="1000px", # 设置宽度 height="800px", # 设置高度 )) .add( series_name="", # 设置为空字符串,不显示图例 data_pair=data, maptype="china", # 指定绘制地图区域 is_map_symbol_show=False, label_opts=opts.LabelOpts(is_show=True) # 显示省份标签 ) .set_global_opts( title_opts=opts.TitleOpts( title="中国地图", pos_left="center", # 标题居中 pos_top="20px" # 标题位置 ), legend_opts=opts.LegendOpts(is_show=False) # 隐藏图例 ) ) # 渲染地图(生成HTML文件) china_map.render("中国地图.html")
这里注意下,因为当前只想生成中国行政区域的地图显示,并没有有效的数据需要传入。但是pyecharts对应的传参似乎作为一个必须值(这里不太确定,仍不清楚是否有可以取消这个参数的配置)
目前发现的最优解是保留对应的假数据以对应传参之后,通过如下两步设定确保传参不影响输出结果
-
将
.add()
方法中的series_name
参数设为空字符串""
-
添加
legend_opts=opts.LegendOpts(is_show=False)
彻底隐藏图例
另外经过试验,pyecharts中的图例模块原本作为map函数中一个对应的函数,此部分是可以剔除的。剔除后可以有效关闭相关图例信息的显示
# visualmap_opts=opts.VisualMapOpts( # max_=100, # min_=10, # is_piecewise=True, # pos_left="20px", # 图例位置 # pos_bottom="20px" # 图例位置 # ),
最终运行效果
以html文件输出,鼠标滚轮可以对于显示进行放大缩小调节
另外关于add()函数中maptype变量的赋值,可以参考pyecharts安装后,本地环境中对于指定区域的罗列。
\Python\Python310\Lib\site-packages\pyecharts\datasets\map_filename.json
在此json文件中出现的地名均可支持进行pyecharts的地图绘制
因此我们可以在前一段代码的基础上进行改进,使其可以一次性输出中国所有省级行政区下所有地级行政区的地图,以及直辖市、港澳台地区的地图
from pyecharts import options as opts from pyecharts.charts import Map import os # 准备数据(假数据,绘制中不显示,仅作为传参功能) provinces = ["北京", "上海", "广东", "江苏", "浙江", "四川", "湖北", "湖南", "河南", "山东"] values = [100, 90, 80, 70, 60, 50, 40, 30, 20, 10] # 将数据转换为Pyecharts需要的格式 data = list(zip(provinces, values)) area_name = { # 直辖市北京,天津,上海,重庆 "beijing": ["北京"], "tianjin": ["天津"], "shanghai": ["上海"], "chongqing": ["重庆"], # 河北省 "hebei": ["河北", "石家庄", "唐山", "秦皇岛", "邯郸", "邢台", "保定", "张家口", "承德", "沧州", "廊坊", "衡水"], # 山西省 "shanxi": ["山西", "太原", "大同", "阳泉", "长治", "晋城", "朔州", "晋中", "运城", "忻州", "临汾", "吕梁"], # 内蒙古自治区 "neimenggu": ["内蒙古", "呼和浩特", "包头", "乌海", "赤峰", "通辽", "鄂尔多斯", "呼伦贝尔", "巴彦淖尔", "乌兰察布", "兴安盟", "锡林郭勒盟", "阿拉善盟"], # 辽宁省 "liaoning": ["辽宁", "沈阳", "大连", "鞍山", "抚顺", "本溪", "丹东", "锦州", "营口", "阜新", "辽阳", "盘锦", "铁岭", "朝阳", "葫芦岛"], # 吉林省 "jilin": ["吉林", "长春", "吉林市", "四平", "辽源", "通化", "白山", "松原", "白城", "延边朝鲜族自治州"], # 黑龙江省 "heilongjiang": ["黑龙江", "哈尔滨", "齐齐哈尔", "鸡西", "鹤岗", "双鸭山", "大庆", "伊春", "佳木斯", "七台河", "牡丹江", "黑河", "绥化", "大兴安岭地区"], # 江苏省 "jiangsu": ["江苏", "南京", "无锡", "徐州", "常州", "苏州", "南通", "连云港", "淮安", "盐城", "扬州", "镇江", "泰州", "宿迁"], # 浙江省 "zhejiang": ["浙江", "杭州", "宁波", "温州", "嘉兴", "湖州", "绍兴", "金华", "衢州", "舟山", "台州", "丽水"], # 安徽省 "anhui": ["安徽", "合肥", "芜湖", "蚌埠", "淮南", "马鞍山", "淮北", "铜陵", "安庆", "黄山", "滁州", "阜阳", "宿州", "六安", "亳州", "池州", "宣城"], # 福建省 "fujian": ["福建", "福州", "厦门", "莆田", "三明", "泉州", "漳州", "南平", "龙岩", "宁德"], # 江西省 "jiangxi": ["江西", "南昌", "景德镇", "萍乡", "九江", "新余", "鹰潭", "赣州", "吉安", "宜春", "抚州", "上饶"], # 山东省 "shandong": ["山东", "济南", "青岛", "淄博", "枣庄", "东营", "烟台", "潍坊", "济宁", "泰安", "威海", "日照", "临沂", "德州", "聊城", "滨州", "菏泽"], # 河南省 "henan": ["河南", "郑州", "开封", "洛阳", "平顶山", "安阳", "鹤壁", "新乡", "焦作", "濮阳", "许昌", "漯河", "三门峡", "南阳", "商丘", "信阳", "周口", "驻马店", "济源"], # 湖北省 "hubei": ["湖北", "武汉", "黄石", "十堰", "宜昌", "襄阳", "鄂州", "荆门", "孝感", "荆州", "黄冈", "咸宁", "随州", "恩施土家族苗族自治州", "仙桃", "潜江", "天门", "神农架林区"], # 湖南省 "hunan": ["湖南", "长沙", "株洲", "湘潭", "衡阳", "邵阳", "岳阳", "常德", "张家界", "益阳", "郴州", "永州", "怀化", "娄底", "湘西土家族苗族自治州"], # 广东省 "guangdong": ["广东", "广州", "韶关", "深圳", "珠海", "汕头", "佛山", "江门", "湛江", "茂名", "肇庆", "惠州", "梅州", "汕尾", "河源", "阳江", "清远", "东莞", "中山", "潮州", "揭阳", "云浮"], # 广西壮族自治区 "guangxi": ["广西", "南宁", "柳州", "桂林", "梧州", "北海", "防城港", "钦州", "贵港", "玉林", "百色", "贺州", "河池", "来宾", "崇左"], # 海南省 "hainan": ["海南", "海口", "三亚", "三沙", "儋州"], # 四川省 "sichuan": ["四川", "成都", "自贡", "攀枝花", "泸州", "德阳", "绵阳", "广元", "遂宁", "内江", "乐山", "南充", "眉山", "宜宾", "广安", "达州", "雅安", "巴中", "资阳", "阿坝藏族羌族自治州", "甘孜藏族自治州", "凉山彝族自治州"], # 贵州省 "guizhou": ["贵州", "贵阳", "六盘水", "遵义", "安顺", "毕节", "铜仁", "黔西南布依族苗族自治州", "黔东南苗族侗族自治州", "黔南布依族苗族自治州"], # 云南省 "yunnan": ["云南", "昆明", "曲靖", "玉溪", "保山", "昭通", "丽江", "普洱", "临沧", "楚雄彝族自治州", "红河哈尼族彝族自治州", "文山壮族苗族自治州", "西双版纳傣族自治州", "大理白族自治州", "德宏傣族景颇族自治州", "怒江傈僳族自治州", "迪庆藏族自治州"], # 西藏自治区 "xizang": ["西藏", "拉萨", "日喀则", "昌都", "林芝", "山南", "那曲", "阿里地区"], # 陕西省 "shaanxi": ["陕西", "西安", "铜川", "宝鸡", "咸阳", "渭南", "延安", "汉中", "榆林", "安康", "商洛"], # 甘肃省 "gansu": ["甘肃", "兰州", "嘉峪关", "金昌", "白银", "天水", "武威", "张掖", "平凉", "酒泉", "庆阳", "定西", "陇南", "临夏回族自治州", "甘南藏族自治州"], # 青海省 "qinghai": ["青海", "西宁", "海东", "海北藏族自治州", "黄南藏族自治州", "海南藏族自治州", "果洛藏族自治州", "玉树藏族自治州", "海西蒙古族藏族自治州"], # 宁夏回族自治区 "ningxia": ["宁夏", "银川", "石嘴山", "吴忠", "固原", "中卫"], # 新疆维吾尔自治区 "xinjiang": ["新疆", "乌鲁木齐", "克拉玛依", "吐鲁番", "哈密", "昌吉回族自治州", "博尔塔拉蒙古自治州", "巴音郭楞蒙古自治州", "阿克苏地区", "克孜勒苏柯尔克孜自治州", "喀什地区", "和田地区", "伊犁哈萨克自治州", "塔城地区", "阿勒泰地区"], # 香港 "hongkong": ["香港"], # 澳门 "macau": ["澳门"], # 台湾 "taiwan": ["台湾"] } # 遍历每个省份及其下辖城市 for province, cities in area_name.items(): # 跳过省级行政单位(如果需要生成省级地图可以保留) if province == "china_provinces": continue # 构建完整目录路径 target_dir = os.path.join("html", province) # 创建以省级命名的目录(自动处理多级嵌套) os.makedirs(target_dir, exist_ok=True) for city in cities: try: # 创建地图对象 china_map = ( Map(init_opts=opts.InitOpts( width="1000px", height="800px", )) .add( series_name="", data_pair=data, maptype=city, is_map_symbol_show=False, label_opts=opts.LabelOpts(is_show=True) ) .set_global_opts( title_opts=opts.TitleOpts( title=f"{city}地图", pos_left="center", pos_top="20px" ), legend_opts=opts.LegendOpts(is_show=False) ) ) # 构建文件路径 file_path = os.path.join(target_dir, f"{city}地图.html") # 渲染地图 china_map.render(file_path) print(f"成功生成:{file_path}") except Exception as e: print(f"生成{city}地图时出错:{str(e)}") continue
对于地理可视化内容感兴趣的朋友可以试一试
参考资料:https://05x-docs.pyecharts.org/#/zh-cn/prepare