当前位置: 首页 > 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 ThemeType

df = 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 opts


def 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 geo

if __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 JsCode

df=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 opts

geo = 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 pie


def 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 c

chart = 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 ThemeType

df = 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 = population
        data_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)效果

在这里插入图片描述

相关文章:

  • 基于Yolov8的植物病虫害检测系统
  • Linux线程属性与多线程开发:API详解与实战代码解析
  • 【一起来学kubernetes】37、lstio使用详解
  • 【前端】webpack一本通
  • HTML入门—表格与表单设计
  • 十大PDF解析工具在不同文档类别中的比较研究
  • HTTP 协议-应用层
  • STM32蓝牙连接Android实现云端数据通信(电机控制-开源)
  • Unity UI中的Pixels Per Unit
  • 从源码安装ROS的serial包(替换github的方案)
  • Python中的strip()
  • VSCode CMake调试CPP程序
  • 闲鱼分销玩法详解
  • 深入解读 React 纯组件(PureComponent)
  • 【Chain(链) 和 LCEL(LangChain Expression Language) 】概念区,用途差异对比
  • JavaScript学习教程,从入门到精通, JavaScript 函数全面解析与案例实践(11)
  • 浏览器与网络模块
  • 大模型——mcp-ui基于MCP协议的简洁AI聊天界面
  • Transformer模型的自注意机制原理、作用、优缺点,通俗易懂
  • qt mapFrom返回的QPoint和event->pos()区别和globalPos区别
  • ic电子网站建设/网络推广有哪些常见的推广方法
  • 东营注册公司/香港seo公司
  • 建设银行网站 查余额查询/网络营销实训个人总结
  • 中国做外贸的网站有哪些/seo实训报告
  • wordpress 随机播放器/关键词优化的作用
  • 淘宝如何在其他网站做优惠/网络营销软件下载