当前位置: 首页 > news >正文

利用 pyecharts 实现地图的数据可视化——第七次人口普查数据的2d、3d展示(关键词:2d 、3d 、map、 geo、涟漪点)

参考文档:链接: link_pyecharts 官方文档

1、map() 传入省份全称,date_pair 是列表套列表 [ [ ],[ ] … ]
2、geo() 传入省份简称,date_pair 是列表套元组 [ ( ),( ) … ]

1、准备数据

population_data:简称+经纬度

在这里插入图片描述

population_data1:省份简称

在这里插入图片描述

population_data2:省份全称

在这里插入图片描述

2.1 2D 图展示 —— map (数据集省份全称)

(1)代码

from pyecharts.charts import Map
from pyecharts import options as opts
import pandas as pd
from pyecharts.globals import ThemeTypedf = pd.read_csv('population_data2.csv',encoding='utf-8')
print(df['人口数量'].max(),df['人口数量'].min())
# 初始化Map对象
map_chart = Map()
# 添加数据和设置地图类型
map_chart.add("人口数量", [list(z) for z in zip(df['省份'], df['人口数量'])], "china")
# 设置全局配置项
map_chart.set_global_opts(title_opts=opts.TitleOpts(title="第七次人口普查各省人口数量"),visualmap_opts=opts.VisualMapOpts(max_=126012510,min_=3648100,is_piecewise=False,range_color=["#e0f3f8", "#0868ac"] ),tooltip_opts=opts.TooltipOpts(formatter="{b}: {c}")
)
# 渲染地图
map_chart.render(r"res/1_1_population_map_2d.html")

(2)zip 函数

zip() 是一个内置函数,它的主要功能是将多个可迭代对象(像列表、元组、字符串等)中对应的元素打包成一个个元组,最后返回由这些元组组成的对象

(3)传入的数据类型是 list

(3)效果

在这里插入图片描述

2.2 涟漪点效果 —— Geo(数据集省份简称) : type_=‘effectScatter’

(1)代码

from pyecharts.charts import *
from pyecharts import options as optsdef geo_effect_scatter():geo = Geo(init_opts=opts.InitOpts(theme='light',width='1000px',height='600px'))geo.add_schema(maptype="china")geo.add("",[("广州", 150), ("北京", 70), ("长沙", 64), ("上海", 74),  ("厦门", 63)],# 带涟漪效果的散点图type_='effectScatter')return geoif __name__ == '__main__':chart = geo_effect_scatter()chart.render(path=r'res/1_2_geo_effect_scatter.html')

(2)传入的数据类型是元组

(3)效果

在这里插入图片描述

2.3 热力图 —— Geo(数据集省份简称): type_=“heatmap”

(1)代码

from pyecharts.charts import Geo
from pyecharts import options as opts
import pandas as pd
from pyecharts.commons.utils import JsCodedf=pd.read_csv('population_data1.csv',encoding='utf-8')
final_chart = (Geo().add_schema(maptype="china")# 添加地图填充数据.add("人口数量",[list(z) for z in zip(df['省份'], df['人口数量'])],type_="heatmap",blur_size=15).set_global_opts(title_opts=opts.TitleOpts(title="人口分布及重点城市"),visualmap_opts=opts.VisualMapOpts(max_=126012510,min_=3648100,range_color=["#e0f3f8", "#0868ac"]),tooltip_opts=opts.TooltipOpts(trigger="item",formatter=JsCode("""function(params) {console.log('params:', params); return [params.name + params.value.toLocaleString()].join('<br/>');}""")))
)final_chart.render("res/1_4_heatmap.html")

(2)效果

在这里插入图片描述

(3)存在的问题

不能正常显示数据标签,如有解决方案,欢迎交流

2.4 关于Geo()和Map()结合的探索 —— Grid()、Page()、overlap() 不适用于地图

(1)Grid()

代码

"""
# 1、Grid() Geo散点图和 Map 地图结合-------------------
"""
from pyecharts.charts import Geo, Map, Grid
from pyecharts import options as opts# 创建 Geo  地图(散点图)
geo = Geo()
geo.add_schema(maptype="china")
geo.add("人口", [("北京", 2189), ("上海", 2487)], type_="effectScatter", tooltip_opts=opts.TooltipOpts(formatter="{b}: {c}"))# 创建 Map 地图(填充色)
map_chart = Map()
map_chart.add("人口", [("北京", 2189), ("上海", 2487)], "china", tooltip_opts=opts.TooltipOpts(formatter="{b}: {c}"))# 使用 Grid 组合
grid = Grid()
grid.add(geo,grid_opts=opts.GridOpts())
grid.add(map_chart,grid_opts=opts.GridOpts())grid.render("res/1_3_1_geo_and_map_grid.html")

效果

在这里插入图片描述

(2)Page() : 一页上放两张图

代码

'''
# 2、page() -------------------
'''
from pyecharts.charts import Geo, Map, Page
from pyecharts import options as opts
page = Page()
page.add(Geo().add_schema("china").add("人口", [("北京", 2189)], "effectScatter"))
# 添加 Map 图表并配置视觉映射
map_chart = (Map().add("人口", [["北京市", 2189]], "china").set_global_opts(visualmap_opts=opts.VisualMapOpts(max_=2189,  # 这里可以根据实际数据调整最大值min_=0,  # 这里可以根据实际数据调整最小值range_color=["#e0f3f8", "#0868ac"]  # 颜色范围))
)
page.add(map_chart)
page.render("res/1_3_2_geo_and_map_page.html")

效果

在这里插入图片描述

(3)热力图叠加涟漪点

代码

from pyecharts.charts import Geo
from pyecharts import options as optsgeo = Geo()
geo.add_schema(maptype="china")# (1) 添加散点(涟漪效果),设置涟漪颜色为紫色
geo.add("重点城市",[("北京", 2189), ("上海", 2487)],type_="effectScatter",symbol_size=10,label_opts=opts.LabelOpts(is_show=False),effect_opts=opts.EffectOpts(color="purple"),  # 设置涟漪颜色为紫色tooltip_opts=opts.TooltipOpts(formatter="{b}: {c}")  # 鼠标悬停显示值
)# (2) 添加热力图(颜色映射),鼠标悬停显示值
geo.add("人口密度",[("北京", 2189), ("上海", 2487), ("广东", 12601)],type_="heatmap",blur_size=20,tooltip_opts=opts.TooltipOpts(formatter="{b}: {c}")  # 鼠标悬停显示值
)geo.set_global_opts(visualmap_opts=opts.VisualMapOpts(is_show=True)
)
geo.render("res/1_3_3_geo_heatmap_scatter.html")

效果

在这里插入图片描述

(4)overlap 叠加饼图(玫瑰图)和 柱形图

代码

from pyecharts.charts import Pie,Bar
from pyecharts import options as opts
from pyecharts.commons.utils import JsCode
from pyecharts.globals import ThemeType
def gender_mi():  # 性别展示 环形图cate_1 = ['男', '女']data_1 = [614, 277]pie = (Pie(init_opts=opts.InitOpts(theme=ThemeType.ROMA)).add('', [list(z) for z in zip(cate_1, data_1)],radius=["30%", "50%"],  # 控制内外半径,即图的大小rosetype="radius",  # 表明是玫瑰图,半径跟数值挂钩center=["75%", "25%"])  # 饼图中心的位置,即整个图的位置。格式:[左右,上下]# .set_global_opts(title_opts=opts.TitleOpts(title="喜欢mi_10_young人群性别", subtitle="有效数据约900人", pos_left='5%'),#                legend_opts=opts.LegendOpts(pos_left="35%")).set_series_opts(label_opts=opts.LabelOpts(formatter="{b}: {d}%")))return piedef age_gender_mi():list2 = [{"value": 17, "percent": 17 / (17 + 5)},{"value": 55, "percent": 55 / (55 + 50)},{"value": 150, "percent": 150 / (150 + 81)},{"value": 60, "percent": 60 / (14 + 60)},{"value": 11, "percent": 11 / 11},]list3 = [{"value": 5, "percent": 5 / (17 + 5)},{"value": 50, "percent": 50 / (55 + 50)},{"value": 81, "percent": 81 / (150 + 81)},{"value": 14, "percent": 14 / (14 + 60)},{"value": 0, "percent": 0 / (96603 + 40234)},]c = (Bar(init_opts=opts.InitOpts(theme=ThemeType.ROMA, width='1400px', height='500px'), ).add_xaxis(['<18岁', '19-22岁', '23-30岁', '31-40岁', '>40岁']).add_yaxis("男", list2, stack="stack1", category_gap="50%").add_yaxis("女", list3, stack="stack1", category_gap="50%").set_series_opts(label_opts=opts.LabelOpts(position="right",formatter=JsCode("function(x){return Number(x.data.percent * 100).toFixed() + '%';}"),)).set_global_opts(title_opts=opts.TitleOpts(title="用户年龄段及性别分布", subtitle="23-30岁的男性为主力军", pos_left='5%')))c2 = gender_mi()  # 把环图读进来c.overlap(c2)  # 两个图重叠return cchart = age_gender_mi()
# 渲染图表为HTML文件
chart.render("res/1_3_4_age_gender_chart.html")

效果

在这里插入图片描述

2.5 散点图+涟漪点 —— Geo() 这样可以规避热力图无法正常显示数据标签的弊端

(1)代码

from pyecharts.charts import Geo
from pyecharts import options as opts
from pyecharts.globals import ChartType
import pandas as pd
from pyecharts.commons.utils import JsCode# 准备数据(含经纬度)
df = pd.read_csv('population_data.csv',encoding='utf-8')# 获取人口前五的省份
top5 = df.nlargest(5, '人口数量')
effect_data = [(row['省份'], row['人口数量']) for _, row in top5.iterrows()]# 创建Geo图表
geo = (Geo(init_opts=opts.InitOpts(width="1000px", height="600px", theme="light", bg_color="#f8f9fa")).add_schema(maptype="china", itemstyle_opts=opts.ItemStyleOpts(color="#f1f3f5", border_color="#ced4da"))# 添加散点图(所有省份).add(series_name="人口分布",data_pair=[(row['省份'], row['人口数量']) for _, row in df.iterrows()],type_=ChartType.SCATTER,symbol_size=10,label_opts=opts.LabelOpts(is_show=False),  # 不显示数据标签itemstyle_opts=opts.ItemStyleOpts(color=JsCode("function(params) {return '#1a73e8';}")))# 添加前五名涟漪点.add(series_name="TOP5人口大省",data_pair=effect_data,type_=ChartType.EFFECT_SCATTER,symbol_size=18,effect_opts=opts.EffectOpts(scale=4, period=3, color="#d6336c"),  # 修改涟漪颜色label_opts=opts.LabelOpts(is_show=False),  # 不显示数据标签itemstyle_opts=opts.ItemStyleOpts(color="#d6336c")  # 与涟漪颜色一致)# 设置全局配置.set_global_opts(title_opts=opts.TitleOpts(title="中国各省人口分布热力图",subtitle="数据来源:第七次全国人口普查 | TOP5省份特别标注",pos_left="center",title_textstyle_opts=opts.TextStyleOpts(color="#212529",font_size=20,font_weight="bold"),subtitle_textstyle_opts=opts.TextStyleOpts(color="#6c757d",font_size=12)),visualmap_opts=opts.VisualMapOpts(max_=126012510,min_=3648100,is_piecewise=False,range_color=["#fde725", "#b4de2c", "#5dc962", "#35b779", "#316395"],  # 修改为新的配色方案pos_left="20px",pos_bottom="20px",textstyle_opts=opts.TextStyleOpts(color="#495057")),legend_opts=opts.LegendOpts(pos_top="60px",pos_right="20px",textstyle_opts=opts.TextStyleOpts(color="#495057"),item_width=20,item_height=12,inactive_color="#adb5bd"),tooltip_opts=opts.TooltipOpts(trigger="item",formatter=JsCode("""function(params) {return params.name + ': ' + params.value.toLocaleString();}"""),  # 鼠标悬停时显示值,格式化为带逗号的数字background_color="rgba(255,255,255,0.95)",border_color="#dee2e6",border_width=1,textstyle_opts=opts.TextStyleOpts(color="#495057")))
)# 渲染图表
geo.render("res/1_7_china_population_heatmap_with_top5.html")

(2)效果

在这里插入图片描述

2.6 散点图+热力图+涟漪点—— 全部Geo()

(1)代码

from pyecharts.charts import Geo
from pyecharts import options as opts
from pyecharts.globals import ChartType
import pandas as pd
from pyecharts.commons.utils import JsCode# 准备数据(含经纬度)
df = pd.read_csv('population_data.csv',encoding='utf-8')# 获取人口前五的省份
top5 = df.nlargest(5, '人口数量')
effect_data = [(row['省份'], row['人口数量']) for _, row in top5.iterrows()]# 创建Geo图表
geo = (Geo(init_opts=opts.InitOpts(width="1000px", height="600px", theme="light", bg_color="#f8f9fa")).add_schema(maptype="china", itemstyle_opts=opts.ItemStyleOpts(color="#f1f3f5", border_color="#ced4da"))# 添加散点图(所有省份).add(series_name="人口分布",data_pair=[(row['省份'], row['人口数量']) for _, row in df.iterrows()],type_=ChartType.SCATTER,symbol_size=10,label_opts=opts.LabelOpts(is_show=False),  # 不显示数据标签itemstyle_opts=opts.ItemStyleOpts(color=JsCode("function(params) {return '#1a73e8';}")))# 添加前五名涟漪点.add(series_name="TOP5人口大省",data_pair=effect_data,type_=ChartType.EFFECT_SCATTER,symbol_size=18,effect_opts=opts.EffectOpts(scale=4, period=3, color="#d6336c"),  # 修改涟漪颜色label_opts=opts.LabelOpts(is_show=False),  # 不显示数据标签itemstyle_opts=opts.ItemStyleOpts(color="#d6336c")  # 与涟漪颜色一致)# 设置全局配置.set_global_opts(title_opts=opts.TitleOpts(title="中国各省人口分布热力图",subtitle="数据来源:第七次全国人口普查 | TOP5省份特别标注",pos_left="center",title_textstyle_opts=opts.TextStyleOpts(color="#212529",font_size=20,font_weight="bold"),subtitle_textstyle_opts=opts.TextStyleOpts(color="#6c757d",font_size=12)),visualmap_opts=opts.VisualMapOpts(max_=126012510,min_=3648100,is_piecewise=False,range_color=["#fde725", "#b4de2c", "#5dc962", "#35b779", "#316395"],  # 修改为新的配色方案pos_left="20px",pos_bottom="20px",textstyle_opts=opts.TextStyleOpts(color="#495057")),legend_opts=opts.LegendOpts(pos_top="60px",pos_right="20px",textstyle_opts=opts.TextStyleOpts(color="#495057"),item_width=20,item_height=12,inactive_color="#adb5bd"),tooltip_opts=opts.TooltipOpts(trigger="item",formatter=JsCode("""function(params) {return params.name + ': ' + params.value.toLocaleString();}"""),  # 鼠标悬停时显示值,格式化为带逗号的数字background_color="rgba(255,255,255,0.95)",border_color="#dee2e6",border_width=1,textstyle_opts=opts.TextStyleOpts(color="#495057")))
)# 渲染图表
geo.render("res/1_7_china_population_heatmap_with_top5.html")

(2)效果

在这里插入图片描述

2.7 利用Grid()实现叠加 —— Geo(散点图+涟漪点)+Map()

(1)代码

from pyecharts.charts import Geo, Map, Grid
from pyecharts import options as opts
from pyecharts.globals import ChartType
import pandas as pd
from pyecharts.commons.utils import JsCode# 准备数据(含经纬度)
df = pd.read_csv('population_data.csv', encoding='utf-8')# 获取人口前五的省份
top5 = df.nlargest(5, '人口数量')
effect_data = [(row['省份'], row['人口数量']) for _, row in top5.iterrows()]# 创建 Geo 图表
geo = (Geo(init_opts=opts.InitOpts(width="1000px", height="600px", theme="light", bg_color="#f8f9fa")).add_schema(maptype="china", itemstyle_opts=opts.ItemStyleOpts(color="#f1f3f5", border_color="#ced4da")).add(series_name="人口分布",data_pair=[(row['省份'], row['人口数量']) for _, row in df.iterrows()],type_=ChartType.SCATTER,symbol_size=10,label_opts=opts.LabelOpts(is_show=False),itemstyle_opts=opts.ItemStyleOpts(color=JsCode("function(params) {return '#1a73e8';}"))).add(series_name="TOP5 人口大省",data_pair=effect_data,type_=ChartType.EFFECT_SCATTER,symbol_size=18,effect_opts=opts.EffectOpts(scale=4, period=3, color="#d6336c"),label_opts=opts.LabelOpts(is_show=False),itemstyle_opts=opts.ItemStyleOpts(color="#d6336c")).set_global_opts(title_opts=opts.TitleOpts(title="中国各省人口分布热力图及普查数量",pos_left="center",title_textstyle_opts=opts.TextStyleOpts(color="#212529",font_size=20,font_weight="bold")),visualmap_opts=opts.VisualMapOpts(max_=126012510,min_=3648100,is_piecewise=False,range_color=["#fde725", "#b4de2c", "#5dc962", "#35b779", "#316395"],pos_left="20px",pos_bottom="20px",textstyle_opts=opts.TextStyleOpts(color="#495057")),legend_opts=opts.LegendOpts(pos_top="10px",pos_right="10px",align="left",textstyle_opts=opts.TextStyleOpts(color="#495057"),item_width=20,item_height=12,inactive_color="#adb5bd"),tooltip_opts=opts.TooltipOpts(trigger="item",formatter=JsCode("""function(params) {return params.name + ': ' + params.value.toLocaleString();}"""),background_color="rgba(255,255,255,0.95)",border_color="#dee2e6",border_width=1,textstyle_opts=opts.TextStyleOpts(color="#495057")))
)df2 = pd.read_csv('population_data2.csv', encoding='utf-8')
print(df2['人口数量'].max(), df2['人口数量'].min())
# 初始化 Map 对象
map_chart = Map()
map_chart.add("人口数量", [list(z) for z in zip(df2['省份'], df2['人口数量'])], "china")
# 设置全局配置项,调整图例位置和颜色
map_chart.set_global_opts(visualmap_opts=opts.VisualMapOpts(max_=126012510,min_=3648100,is_piecewise=False,range_color=["#e0f3f8", "#0868ac"]),tooltip_opts=opts.TooltipOpts(formatter="{b}: {c}"),legend_opts=opts.LegendOpts(pos_top="30px",  # 与 Geo 图表的图例垂直位置对齐pos_right="10px",align="left",textstyle_opts=opts.TextStyleOpts(color="#495057"),item_width=20,item_height=12,inactive_color="#adb5bd")
)# 使用 Grid 组合 Geo 和 Map 图表
grid = (Grid(init_opts=opts.InitOpts(width="1000px", height="1200px")).add(geo, grid_opts=opts.GridOpts(pos_top="5%", pos_bottom="55%")).add(map_chart, grid_opts=opts.GridOpts(pos_top="55%", pos_bottom="5%"))
)# 渲染组合后的图表
grid.render("res/1_7_combined_geo_map00.html")

(2)效果

在这里插入图片描述

(3)问题:图层分离

3.1 3D图

(1)代码

from pyecharts.charts import Map3D
from pyecharts import options as opts
import pandas as pd
from pyecharts.globals import ThemeTypedf = pd.read_csv('population_data2.csv', encoding='utf-8')
print(df['人口数量'].max(), df['人口数量'].min())# 初始化 Map3D 对象
map_chart = Map3D()# 添加数据和设置地图类型
map_chart.add_schema(itemstyle_opts=opts.ItemStyleOpts(color="rgb(5,101,123)",opacity=0.5,border_width=0.8,border_color="rgb(62,215,213)",),map3d_label=opts.Map3DLabelOpts(is_show=True,text_style=opts.TextStyleOpts(color="#fff", font_size=16, background_color="rgba(0,0,0,0)"),),emphasis_label_opts=opts.LabelOpts(is_show=True),light_opts=opts.Map3DLightOpts(main_color="#fff",main_intensity=1.2,is_main_shadow=False,main_alpha=55,main_beta=10,ambient_intensity=0.3,),view_control_opts=opts.Map3DViewControlOpts(),post_effect_opts=opts.Map3DPostEffectOpts(is_enable=False),
)map_chart.add(series_name="人口数量",data_pair=[list(z) for z in zip(df['省份'], df['人口数量'])],maptype="china",label_opts=opts.LabelOpts(is_show=True),
)# 设置全局配置项,优化 tooltip 显示格式
map_chart.set_global_opts(title_opts=opts.TitleOpts(title="第七次人口普查各省人口数量"),visualmap_opts=opts.VisualMapOpts(max_=126012510,min_=3648100,is_piecewise=False,range_color=["#e0f3f8", "#0868ac"],),tooltip_opts=opts.TooltipOpts(formatter="{b}: {c}"),
)# 渲染地图
map_chart.render("res/2_1_population_map_3d.html")

(2)效果

在这里插入图片描述

3.2 3D图优化版——增加柱状图

(1)代码

from pyecharts.charts import Map3D
from pyecharts import options as opts
from pyecharts.globals import ChartType
import pandas as pd
from pyecharts.commons.utils import JsCode# 省份经纬度数据(简化的中心点坐标)
province_coords = {'北京市': [116.4074, 39.9042],'天津市': [117.2019, 39.0851],'河北省': [114.5305, 38.0410],'山西省': [112.5627, 37.8735],'内蒙古自治区': [111.7656, 40.8175],'辽宁省': [123.4291, 41.8357],'吉林省': [125.3268, 43.8969],'黑龙江省': [126.6617, 45.7423],'上海市': [121.4737, 31.2304],'江苏省': [118.7969, 32.0603],'浙江省': [120.1528, 30.2674],'安徽省': [117.2841, 31.8612],'福建省': [119.2956, 26.1005],'江西省': [115.8579, 28.6820],'山东省': [117.0204, 36.6686],'河南省': [113.6254, 34.7466],'湖北省': [114.3423, 30.5459],'湖南省': [112.9838, 28.1124],'广东省': [113.2663, 23.1322],'广西壮族自治区': [108.3275, 22.8167],'海南省': [110.3492, 20.0174],'重庆市': [106.5505, 29.5630],'四川省': [104.0758, 30.6513],'贵州省': [106.7053, 26.6001],'云南省': [102.7100, 25.0453],'西藏自治区': [91.1172, 29.6469],'陕西省': [108.9542, 34.2655],'甘肃省': [103.8263, 36.0594],'青海省': [101.7800, 36.6232],'宁夏回族自治区': [106.2586, 38.4713],'新疆维吾尔自治区': [87.6168, 43.8256]
}# 人口数据
data = [('北京市', 21893095),('天津市', 13866009),('河北省', 74610235),('山西省', 34915616),('内蒙古自治区', 24049155),('辽宁省', 42591407),('吉林省', 24073453),('黑龙江省', 31850088),('上海市', 24870895),('江苏省', 84748016),('浙江省', 64567588),('安徽省', 61027171),('福建省', 41540086),('江西省', 45188635),('山东省', 101527453),('河南省', 99365519),('湖北省', 57752557),('湖南省', 66444864),('广东省', 126012510),('广西壮族自治区', 50126804),('海南省', 10081232),('重庆市', 32054159),('四川省', 83674866),('贵州省', 38562148),('云南省', 47209277),('西藏自治区', 3648100),('陕西省', 39528999),('甘肃省', 25019831),('青海省', 5923957),('宁夏回族自治区', 7202654),('新疆维吾尔自治区', 25852345)
]df = pd.DataFrame(data, columns=['省份', '人口数量'])
max_population = df['人口数量'].max()
min_population = df['人口数量'].min()# 准备数据:格式为[(省份名称, [经度, 纬度, 高度]), ...]
data_pairs = []
for province, population in data:if province in province_coords:lon, lat = province_coords[province]height = populationdata_pairs.append((province, [lon, lat, height]))
print(data_pairs)
print([list(z) for z in zip(df['省份'], df['人口数量'])])
# 初始化 Map3D 对象
map_chart = Map3D()# 添加地图和设置
map_chart.add_schema(# 地图元素的样式配置itemstyle_opts=opts.ItemStyleOpts(color="#808080",# 地图区域的透明度,取值范围为 0 到 1,1 表示完全不透明opacity=1,# 地图区域的边框宽度border_width=0.8,# 地图区域的边框颜色,这里使用 RGB 格式指定为蓝绿色border_color="rgb(62,215,213)",),# 地图上的标签配置map3d_label=opts.Map3DLabelOpts(# 是否显示地图上的标签,False 表示不显示is_show=True,),# 鼠标悬停在地图元素上时标签的配置emphasis_label_opts=opts.LabelOpts(# 鼠标悬停时是否显示标签,False 表示不显示is_show=True,# 鼠标悬停时标签的文字颜色,这里使用十六进制颜色码指定为白色color="#fff",# 鼠标悬停时标签的字体大小font_size=10,# 鼠标悬停时标签的背景颜色,这里使用 RGBA 格式指定为透明background_color="rgba(0,23,11,0)",),# 地图的光照效果配置light_opts=opts.Map3DLightOpts(# 主光源的颜色,这里使用十六进制颜色码指定为白色main_color="#fff",# 主光源的强度,值越大光照越强main_intensity=1.2,# 主光源阴影的质量,"high" 表示高质量阴影main_shadow_quality="high",# 是否显示主光源的阴影,False 表示不显示is_main_shadow=False,# 主光源的仰角,角度值main_beta=10,# 环境光的强度,值越大环境光越亮ambient_intensity=0.3,)
)
map_chart.add(series_name="人口数量",data_pair=[list(z) for z in zip(df['省份'], df['人口数量'])],maptype="china",label_opts=opts.LabelOpts(is_show=True),
)# 添加3D柱状图数据
map_chart.add(series_name="人口数量",data_pair=data_pairs,type_=ChartType.BAR3D,bar_size=1,shading="lambert",label_opts=opts.LabelOpts(is_show=True,),
)# 设置全局配置项
map_chart.set_global_opts(title_opts=opts.TitleOpts(title="第七次人口普查各省人口数量(单位:人)"),visualmap_opts=opts.VisualMapOpts(max_=126012510,min_=3648100,is_piecewise=False,range_color=["#e0f3f8", "#0868ac"],),tooltip_opts=opts.TooltipOpts(formatter=JsCode("function(data){return data.name + ': ' + data.value[2].toFixed(0) + '人<br>经度: ' + data.value[0].toFixed(4) + '<br>纬度: ' + data.value[1].toFixed(4);}")),
)# 渲染地图
map_chart.render("res/2_2_population_map_3d_V2.html")

(2)效果

在这里插入图片描述

相关文章:

利用 pyecharts 实现地图的数据可视化——第七次人口普查数据的2d、3d展示(关键词:2d 、3d 、map、 geo、涟漪点)

参考文档&#xff1a;链接: link_pyecharts 官方文档 1、map() 传入省份全称&#xff0c;date_pair 是列表套列表 [ [ ],[ ] … ] 2、geo() 传入省份简称&#xff0c;date_pair 是列表套元组 [ ( ),( ) … ] 1、准备数据 population_data&#xff1a;简称经纬度 population_da…...

字节跳动开源 LangManus:不止是 Manus 平替,更是下一代 AI 自动化引擎

当 “AI 自动化” 成为科技领域最炙手可热的关键词&#xff0c;我们仿佛置身于一场激动人心的变革前夜。各行各业都在翘首以盼&#xff0c;期待 AI 技术能够真正解放生产力&#xff0c;将人类从繁琐重复的工作中解脱出来。在这个充满无限可能的时代&#xff0c;字节跳动悄然发布…...

第十四届蓝桥杯大赛软件赛省赛C/C++ 大学 A 组真题

文章目录 1 幸运数题目描述&#xff1a;答案&#xff1a;4430091 代码&#xff1a; 2 有奖问答题目描述&#xff1a;重点&#xff1a;答案&#xff1a;8335366 代码&#xff1a; 3 平方差题目描述&#xff1a;思路&#xff1a;数学找规律代码&#xff1a; 4 更小的数题目描述&a…...

springboot+tabula解析pdf中的表格数据

场景 在日常业务需求中&#xff0c;往往会遇到解析pdf数据获取文本的需求&#xff0c;常见的做法是使用 pdfbox 来做&#xff0c;但是它只适合做一些简单的段落文本解析&#xff0c;无法处理表格这种复杂类型&#xff0c;因为单元格中的文本有换行的情况&#xff0c;无法对应到…...

静态链接part1

比较多这一部分&#xff0c;包含了编译和链接&#xff0c;书还没看完就先记录一下其中编译的一部分 编译 gcc编译分为预处理、编译、汇编、链接四个步骤 预处理 也称预编译&#xff0c;主要处理的是源代码文件中以“#”开始的预编译指令&#xff0c;这里简单讲一下规则&…...

golang通过STMP协议发送邮件功能详细操作

一.简介 在 Go 语言中接入 IMAP 和 SMTP 服务来进行邮件的发送和接收操作,可以通过使用一些现有的第三方库来简化操作,常见的库有 go-imap 和 gomail&#xff0c;它们可以帮助我们连接和操作 IMAP 邮箱&#xff08;读取邮件&#xff09;以及通过 SMTP 发送邮件 二.实现 1. IMA…...

分布式锁在秒杀场景中的Python实现与CAP权衡

目录 一、分布式锁的前世今生 二、秒杀系统的 “硬核” 挑战 三、Python 实现分布式锁的 “实战演练” Redis 实现:快准狠 ZooKeeper 实现:稳如老狗 数据库实现:老实本分 四、CAP 理论的 “三角恋” 五、性能优化的 “锦囊妙计” 锁粒度控制:粗细有道 超时机制:别…...

数据驱动的温暖守护:智慧康养平台如何实现 “千人千面” 的精准照护?

在当今数字化时代&#xff0c;七彩喜智慧康养平台借助数据的力量&#xff0c;正逐步打破传统养老服务模式的局限&#xff0c;实现 “千人千面” 的精准照护。 通过收集、分析和利用大量与老年人相关的数据&#xff0c;这些平台能够深入了解每位老人的独特需求&#xff0c;并据…...

基于SSM的校园美食交流系统

作者&#xff1a;计算机学姐 开发技术&#xff1a;SpringBoot、SSM、Vue、MySQL、JSP、ElementUI、Python、小程序等&#xff0c;“文末源码”。 专栏推荐&#xff1a;前后端分离项目源码、SpringBoot项目源码、Vue项目源码、SSM项目源码、微信小程序源码 精品专栏&#xff1a;…...

多线程进阶

进阶的内容&#xff0c;就关于线程的面试题为主了&#xff0c;涉及到的内容在工作中使用较少&#xff0c;但面试会考&#xff01;&#xff01;&#xff01; 锁的策略 加锁的过程中&#xff0c;在处理冲突的过程中&#xff0c;涉及到的一些不同的处理方法&#xff0c;此处的锁…...

聊一聊接口测试时遇到第三方服务时怎么办

目录 一、使用 Mock 或 Stub 模拟第三方服务 二、利用第三方服务的沙箱&#xff08;Sandbox&#xff09;环境 三、测试隔离与数据清理 四、处理异步回调 五、容错与异常测试 六、契约测试 在我们进行接口测试时&#xff0c;有的时候会遇到要调用第三方服务即外部的API&am…...

《Python星球日记》第22天:NumPy 基础

名人说&#xff1a;路漫漫其修远兮&#xff0c;吾将上下而求索。—— 屈原《离骚》 创作者&#xff1a;Code_流苏(CSDN)&#xff08;一个喜欢古诗词和编程的Coder&#x1f60a;&#xff09; 目录 一、NumPy 简介1. 什么是 NumPy&#xff1f;为什么使用 NumPy&#xff1f;2. 安…...

Spring Boot 中 Bean 的生命周期详解

Spring Boot 中 Bean 的生命周期详解 一、引言 在 Spring Boot 应用中&#xff0c;Bean 是构成应用程序的基础组件。理解 Bean 的生命周期对于开发高效、稳定的 Spring Boot 应用至关重要。本文将深入探讨 Spring Boot 中 Bean 的完整生命周期过程。 二、Bean 生命周期的基本…...

结构化需求分析:功能、数据与行为的全景建模

目录 前言1 功能模型&#xff1a;数据流图&#xff08;DFD&#xff09;的结构与应用1.1 数据流图的基本构成要素1.2 数据流图的层次化设计1.3 数据流图的建模价值 2 数据模型&#xff1a;ER图揭示数据结构与关系2.1 ER图的基本组成2.2 建模过程与注意事项2.3 数据模型的价值体现…...

OpenCompass模型评估

OpenCompass面向大模型的开源方和使用者&#xff0c; 提供开源、高效、全面的大模型评测开放平台。 一、OpenCompass文档 1.基础安装 使用Conda准备 OpenCompass 运行环境&#xff1a; conda create --name opencompass python3.10 -y conda activate opencompass2. 安装 Op…...

基于51单片机语音实时采集系统

基于51单片机语音实时采集 &#xff08;程序&#xff0b;原理图&#xff0b;PCB&#xff0b;设计报告&#xff09; 功能介绍 具体功能&#xff1a; 系统由STC89C52单片机ISD4004录音芯片LM386功放模块小喇叭LCD1602按键指示灯电源构成 1.可通过按键随时选择相应的录音进行播…...

NeuroImage:膝关节炎如何影响大脑?静态与动态功能网络变化全解析

膝骨关节炎&#xff08;KOA&#xff09;是导致老年人活动受限和残疾的主要原因之一。这种疾病不仅引起关节疼痛&#xff0c;还会显著影响患者的生活质量。然而&#xff0c;目前对于KOA患者大脑功能网络的异常变化及其与临床症状之间的关系尚不清楚。 2024年4月10日&#xff0c;…...

高级java每日一道面试题-2025年4月01日-微服务篇[Nacos篇]-Nacos集群的数据一致性是如何保证的?

如果有遗漏,评论区告诉我进行补充 面试官: Nacos集群的数据一致性是如何保证的&#xff1f; 我回答: Nacos 集群数据一致性保障机制详解 在 Java 高级面试中&#xff0c;Nacos 集群的数据一致性保障是考察分布式系统核心能力的关键点。以下是 Nacos 通过多种机制和技术确保…...

阿里云 OSS 在 ZKmall开源商城的应用实践

ZKmall开源商城通过深度整合阿里云OSS&#xff08;对象存储服务&#xff09;&#xff0c;构建了高效、安全的文件存储与管理体系&#xff0c;支撑商品图片、用户上传内容等非结构化数据的存储与分发。结合阿里云OSS的技术特性与ZKmall的微服务架构&#xff0c;其实践方案可总结…...

【Linux】线程池与封装线程

目录 一、线程池&#xff1a; 1、池化技术&#xff1a; 2、线程池优点&#xff1a; 3、线程池应用场景&#xff1a; 4、线程池实现&#xff1a; 二、封装线程&#xff1a; 三、单例模式&#xff1a; 四、其他锁&#xff1a; 五、读者写者问题 一、线程池&#xff1a; …...

protobuf的应用

1.版本和引用 syntax "proto3"; // proto2 package tutorial; // package类似C命名空间 // 可以引用本地的&#xff0c;也可以引用include里面的 import "google/protobuf/timestamp.proto"; // 已经写好的proto文件是可以引用 我们版本选择pr…...

linux shell编程之条件语句(二)

目录 一. 条件测试操作 1. 文件测试 2. 整数值比较 3. 字符串比较 4. 逻辑测试 二. if 条件语句 1. if 语句的结构 (1) 单分支 if 语句 (2) 双分支 if 语句 (3) 多分支 if 语句 2. if 语句应用示例 (1) 单分支 if 语句应用 (2) 双分支 if 语句应用 (3) 多分支 …...

图论整理复习

回溯&#xff1a; 模板&#xff1a; void backtracking(参数) {if (终止条件) {存放结果;return;}for (选择&#xff1a;本层集合中元素&#xff08;树中节点孩子的数量就是集合的大小&#xff09;) {处理节点;backtracking(路径&#xff0c;选择列表); // 递归回溯&#xff…...

企业指标设计方法指南

该文档聚焦企业指标设计方法,适用于企业中负责战略规划、业务运营、数据分析、指标管理等相关工作的人员,如企业高管、部门经理、数据分析师等。 主要内容围绕指标设计展开:首先指出指标设计面临的困境,包括权责不清、口径不统一、缺乏标准规范、报表体系混乱、指标…...

AIP-217 不可达资源

编号217原文链接AIP-217: Unreachable resources状态批准创建日期2019-08-26更新日期2019-08-26 有时&#xff0c;用户可能会请求一系列资源&#xff0c;而其中某些资源暂时不可用。最典型的场景是跨集合读。例如用户可能请求返回多个上级位置的资源&#xff0c;但其中某个位置…...

SAP系统控制检验批

问题&#xff1a;同一批物料多检验批问题 现象&#xff1a;同一物料多采购订单同一天到货时&#xff0c;对其采购订单分别收货&#xff0c;导致系统产生多个检验批&#xff0c;需分别请检单、检验报告等&#xff0c;使质量部工作复杂化。 原因&#xff1a;物料主数据质量试图设…...

JavaScript 代码混淆与反混淆技术详解

一、代码混淆&#xff1a;让别人看不懂你的代码 混淆技术就是一种“代码伪装术”&#xff0c;目的是让别人很难看懂你的代码逻辑&#xff0c;从而保护你的核心算法或敏感信息。 1. 变量名压缩 原理&#xff1a;把变量名改成乱码&#xff0c;比如把calculatePrice改成a&#…...

Android studio | From Zero To One ——手机弹幕

===================================================== github:https://github.com/MichaelBeechan CSDN:https://blog.csdn.net/u011344545 ===================================================== 滚动显示 代码activity_main.xmlactivity_fullscreen.xmlAndroidManife…...

面向对象的需求分析与UML构造块详解

目录 前言1 面向对象的需求分析概述2 UML构造块概述3 UML事物详解3.1 结构事物&#xff08;Structural Things&#xff09;3.2 行为事物&#xff08;Behavioral Things&#xff09;3.3 分组事物&#xff08;Grouping Things&#xff09;3.4 解释事物&#xff08;Annotational T…...

LeetCode 2843.统计对称整数的数目:字符串数字转换

【LetMeFly】2843.统计对称整数的数目&#xff1a;字符串数字转换 力扣题目链接&#xff1a;https://leetcode.cn/problems/count-symmetric-integers/ 给你两个正整数 low 和 high 。 对于一个由 2 * n 位数字组成的整数 x &#xff0c;如果其前 n 位数字之和与后 n 位数字…...

RocketMQ深度百科全书式解析

​一、核心架构与设计哲学​ ​1. 设计目标​ ​海量消息堆积​&#xff1a;单机支持百万级消息堆积&#xff0c;适合大数据场景&#xff08;如日志采集&#xff09;。​严格顺序性​&#xff1a;通过队列分区&#xff08;Queue&#xff09;和消费锁机制保证局部顺序。​事务…...

A2A与MCP Server:AI智能体协作与工具交互的核心协议对比

A2A与MCP Server&#xff1a;AI智能体协作与工具交互的核心协议对比 摘要 在AI智能体技术爆发式增长的今天&#xff0c;谷歌的A2A协议与Anthropic的MCP协议正在重塑AI系统架构。本文通过协议栈分层模型、企业级架构设计案例及开发者实践指南三大维度&#xff0c;揭示二者在AI生…...

如何将网页保存为pdf

要将网页保存为PDF&#xff0c;可以按照以下几种方法操作&#xff1a; 1. 使用浏览器的打印功能 大多数现代浏览器&#xff08;如Chrome、Firefox、Edge等&#xff09;都支持将网页保存为PDF文件。步骤如下&#xff1a; 在 Google Chrome 中&#xff1a; 打开你想保存为PDF…...

位运算与实战场景分析-Java代码版

一、为什么每个程序员都要掌握位运算&#xff1f; 在电商秒杀系统中&#xff0c;位运算可以快速判断库存状态&#xff1b;在权限管理系统里&#xff0c;位运算能用极小的空间存储复杂权限配置&#xff1b;在算法竞赛中&#xff0c;位运算更是高频出现的性能优化利器。这项看似…...

【“星睿O6”AI PC开发套件评测】+ Debian 系统安装及 sysbench 跑分对比

很荣幸这次可以得到机会评测 “星睿O6”AI PC开发套件。第一篇文章&#xff0c;我将分为两个部分&#xff1a; 官方 Debian 系统安装到 NVMEsysbench 跑分以及对比 RK3568 和 I712700KF 正文开始之前&#xff0c;忍不住还是想放几张开箱照片&#xff0c;板子实在是太精致了。…...

java——继承

继承是面向对象的三大特征之一&#xff0c;可以使得子类具有父类的属性和方法&#xff0c;还可以在子类中重新定义&#xff0c;追加属性和方法。继承是指在原有类的基础上&#xff0c;进行功能扩展&#xff0c;创建新的类型。 概念与作用 代码复用&#xff1a;继承能够避免重…...

STM32嵌入式开发从入门到实战:全面指南与项目实践

STM32嵌入式开发从入门到实战&#xff1a;全面指南与项目实践 一、STM32开发基础概述 1&#xff0e;STM32微控制器核心特性 STM32微控制器基于ARM Cortex - M内核&#xff0c;具备显著的架构优势。其32位处理能力&#xff0c;能够高效处理复杂的计算任务&#xff0c;相较于传…...

企业数据孤岛如何破

企业数据孤岛如何破 背景信息传统方式Flink CDC如何用技术之力 背景信息 在数字化转型的浪潮中&#xff0c;企业数据的价值正从“事后分析”向“实时驱动”快速迁移。企业需要快速、高效地将分散在不同系统中的数据整合起来&#xff0c;以支持实时分析和业务决策。诚然&#x…...

源码编译安装Nginx

源码编译安装Nginx 源码编译安装Nginx创建nginx服务用户安装编译环境依赖包下载Nginx源码构建编译选项,创建makefile文件编译安装nginx为Nginx创建服务单元设置Nginx开机自启服务 yum安装Nginxyum安装openresty 源码编译安装Nginx 如果需要最新版本及定制化模块可以通过源码安…...

查看容器内的eth0网卡对应宿主机上的哪块网卡

查看容器内的eth0网卡对应宿主机上的哪块网卡 问题描述解决办法1. 进入容器,查看网卡的iflink(接口链路索引)值方法1:方法2: 2. 从宿主机过滤查询到的iflink(接口链路索引)值3. 确定veth接口连接的网桥方法2: brctl查看连接到网桥的接口--推荐 4. 查看网桥连接的物理网卡 问题描…...

虚拟偶像“C位出道”:数字浪潮下的崛起与财富密码(3/10)

摘要&#xff1a;虚拟偶像作为数字时代的新宠&#xff0c;凭借数字技术与文化创意的深度融合&#xff0c;在全球范围内迅速崛起。从早期的简单2D形象到如今高度逼真、智能交互的3D虚拟偶像&#xff0c;其发展得益于计算机图形学、动作捕捉、AI等技术的进步。虚拟偶像不仅在娱乐…...

swift菜鸟教程13(函数)

一个朴实无华的目录 今日学习内容&#xff1a;1.Swift 函数1.1函数定义&#xff1a;使用关键字 func。1.2函数参数&#xff1a;以逗号分隔。1.3不带参数函数1.4元组作为函数返回值1.5没有返回值函数1.6函数参数名称1.6.1局部参数名1.6.2外部参数名 1.7可变参数1.8常量&#xff…...

MacOS红队常用攻击命令

MacOS红队常用攻击命令 1.自动化武器2.系统信息3.服务 & 内核信息4.快捷命令5.网络相关6.brew相关 / 软件包相关7.高权限命令8.创建一个管理员权限的后门用户 1.自动化武器 1、linPEAS LinPEAS 是一个脚本&#xff0c;用于在 Linux/Unix/MacOS 主机上搜索提权路径 2、me…...

无人机的振动与噪声控制技术!

一、振动控制技术要点 1. 振动源分析 气动振动&#xff1a;旋翼桨叶涡脱落&#xff08;如叶尖涡干涉&#xff09;、动态失速&#xff08;Dynamic Stall&#xff09;引发的周期性气动激振力&#xff08;频率与转速相关&#xff09;。 机械振动&#xff1a;电机偏心、传动轴不…...

如何使用 Spring Boot 实现分页和排序?

全文目录&#xff1a; 开篇语1. 创建 Spring Boot 项目2. 配置数据库连接3. 创建实体类4. 创建 Repository 接口5. 创建分页和排序服务6. 创建控制器7. 测试分页和排序请求示例&#xff1a;返回结果&#xff1a; 8. 总结 文末 开篇语 哈喽&#xff0c;各位小伙伴们&#xff0c;…...

浅谈编译型语言的运用

如大家所熟悉的&#xff0c;程序在执行之前需要一个专门的编译过程&#xff0c;把程序编译成机器语言的文件&#xff0c;运行时不需要重新翻译&#xff0c;直接使用编译的结果就行了&#xff0c;程序执行效率高&#xff0c;依赖编译器&#xff0c;如 C/C、Golang 等&#xff0c…...

知识了解02——了解pnpm+vite+turbo+monorepo的完整构建步骤(react子项目)

&#xff08;1&#xff09;初始化monorepo 1)创建项目目录并进入当前目录 2)初始化 pnpm 工作区&#xff0c;生成一个package.json文件 3)在项目根目录下创建 pnpm-workspace.yaml 文件&#xff0c;并定义工作区目录 &#xff08;2&#xff09;安装 Turborepo 1&#xff09;安…...

MySQL 半同步复制,给数据找靠谱 “分身”

目录 一背景 二、MySQL 复制基础概念 为何需要 MySQL 复制 传统异步复制 半同步复制的诞生 三、MySQL 半同步复制原理详解 主要组件及作用 工作流程 半同步复制流程图 四、MySQL 半同步复制配置与代码示例 环境准备 主服务器配置 从服务器配置 示例说明 五、MyS…...

uniapp离线打包提示未添加videoplayer模块

uniapp中使用到video标签&#xff0c;但是离线打包放到安卓工程中&#xff0c;运行到真机中时提示如下&#xff1a; 解决方案&#xff1a; 1、把media-release.aar、weex_videoplayer-release.aar放到工程的libs目录下; 文档&#xff1a;https://nativesupport.dcloud.net.cn/…...

机器人零位标定修正流程介绍

如果想看运动学标定可以看看 机器人运动学参数标定, 一次性把运动学参数和零位标定等一起标定求解. 1. 零位标定 零位标定是机器人运动学标定中的一个重要步骤&#xff0c;其目的是校正机器人关节的初始位置误差。以下是需要进行零位标定的主要原因&#xff1a; 制造误差 在机…...