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

news2025/4/15 13:26:47

参考文档:链接: 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)效果

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2334195.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

解决 Elasticsearch 分页查询性能瓶颈——从10分钟到秒级的优化实践

大家好&#xff0c;我是铭毅天下&#xff0c;一名专注于 Elasticsearch &#xff08;以下简称ES&#xff09;技术栈的技术爱好者。 今天我们来聊聊球友提出的一个实际问题&#xff1a; ES分页查询性能很差&#xff0c;使用from/size方式检索居然需要10分钟&#xff01; 这是一个…

记录IBM服务器检测到备份GPT损坏警告排查解决过程

服务器设备&#xff1a;IBM x3550 M4 Server IMM默认IP地址&#xff1a;192.168.70.125 用户名&#xff1a;USERID 密码&#xff1a;PASSW0RD&#xff08;注意是零0&#xff09; 操作系统&#xff1a;Windows Hyper-V Server 2016 IMM Web System Status Warning&#xff1…

毫米波测试套装速递!高效赋能5G/6G、新材料及智能超表面(RIS)研发

德思特&#xff08;Tesight&#xff09;作为全球领先的测试测量解决方案提供商&#xff0c;始终致力于为前沿技术研发提供高精度、高效率的测试工具。 针对毫米波技术在高频通信、智能超表面&#xff08;RIS&#xff09;、新材料等领域的快速应用需求&#xff0c;我们推出毫米…

Linux中卸载宝塔面板

输入命令 wget http://download.bt.cn/install/bt-uninstall.sh 执行脚本命令 sh bt-uninstall.sh 根据自己的情况选择1还是2 卸载完成校验 bt 这样我们的宝塔面板就卸载完了

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

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

【蓝桥杯】第十六届蓝桥杯 JAVA B组记录

试题 A: 逃离高塔 很简单&#xff0c;签到题&#xff0c;但是需要注意精度&#xff0c;用int会有溢出风险 答案&#xff1a;202 package lanqiao.t1;import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.io.PrintWrit…

OSPF的接口网络类型【复习篇】

OSPF在不同网络环境下默认的不同工作方式 [a3]display ospf interface g 0/0/0 # 查看ospf接口的网络类型网络类型OSPF接口的网络类型&#xff08;工作方式&#xff09;计时器BMA&#xff08;以太网&#xff09;broadcast &#xff0c;需要DR/BDR的选举hello&#xff1a;10s…

python+requests接口自动化测试框架实例教程

&#x1f345; 点击文末小卡片 &#xff0c;免费获取软件测试全套资料&#xff0c;资料在手&#xff0c;涨薪更快 前段时间由于公司测试方向的转型&#xff0c;由原来的web页面功能测试转变成接口测试&#xff0c;之前大多都是手工进行&#xff0c;利用postman和jmeter进行…

2021第十二届蓝桥杯大赛软件赛省赛C/C++ 大学 B 组

记录刷题的过程、感悟、题解。 希望能帮到&#xff0c;那些与我一同前行的&#xff0c;来自远方的朋友&#x1f609; 大纲&#xff1a; 1、空间-&#xff08;题解&#xff09;-字节单位转换 2、卡片-&#xff08;题解&#xff09;-可以不用当组合来写&#xff0c;思维题 3、直…

智能资源管理机制-重传机制

一、发送端资源管理的核心机制 1. 滑动窗口&#xff08;Sliding Window&#xff09; 这是TCP协议的核心优化设计&#xff1a; 窗口动态滑动&#xff1a;发送端不需要保留所有已发送的分组&#xff0c;只需维护一个"发送窗口"窗口大小&#xff1a;由接收方通告的接…

设计模式 --- 原型模式

原型模式是创建型模式的一种&#xff0c;是在一个原型的基础上&#xff0c;建立一致的复制对象的方式。这个原型通常是我们在应用程序生命周期中需要创建多次的一个典型对象。为了避免初始化新对象潜在的性能开销&#xff0c;我们可以使用原型模式来建立一个非常类似于复印机的…

汽车软件开发常用的建模工具汇总

目录 往期推荐 1.Enterprise Architect&#xff08;EA&#xff09; 2.MATLAB/Simulink 3.TargetLink 4.Rational Rhapsody 5.AUTOSAR Builder 6.PREEvision 总结 往期推荐 2025汽车行业新宠&#xff1a;欧企都在用的工具软件ETAS工具链自动化实战指南&#xff1c;一&am…

SSM废品买卖回收管理系统的设计与实现

&#x1f345;点赞收藏关注 → 添加文档最下方联系方式咨询本源代码、数据库&#x1f345; 本人在Java毕业设计领域有多年的经验&#xff0c;陆续会更新更多优质的Java实战项目希望你能有所收获&#xff0c;少走一些弯路。&#x1f345;关注我不迷路&#x1f345; 项目视频 07…

@SchedulerLock 防止分布式环境下定时任务并发执行

背景 在一个有多个服务实例的分布式系统中&#xff0c;如果你用 Scheduled 来定义定时任务&#xff0c;所有实例都会执行这个任务。ShedLock 的目标是只让一个实例在某一时刻执行这个定时任务。 使用步骤 引入依赖 当前以redisTemplate为例子&#xff0c;MongoDB、Zookeeper…

实信号的傅里叶变换为何属于埃尔米特函数?从数学原理到 MATLAB 动态演示

引言 在信号处理领域&#xff0c;傅里叶变换是分析信号在频域表现的重要工具。特别是对于实信号&#xff0c;实信号是指在时间或空间域内取值为实数的信号&#xff0c;例如音频信号、温度变化等&#xff0c;它的傅里叶变换展现了一个非常特殊的数学性质——共轭对称性&#xf…

【VitePress】新增md文件后自动更新侧边栏导航

目录 说在前面先看效果代码结构详细说明侧边栏格式utils监听文件变化使用pm2管理监听进程 说在前面 操作系统&#xff1a;windows11node版本&#xff1a;v18.19.0npm版本&#xff1a;10.2.3vitepress版本&#xff1a;1.6.3完整代码&#xff1a;github 先看效果 模板用的就是官…

docker部署scylladb

创建存储数据的目录和配置目录 mkdir -p /root/docker/scylla/data/data /root/docker/scylla/data/commitlog /root/docker/scylla/data/hints /root/docker/scylla/data/view_hints /root/docker/scylla/conf快速启动拷贝配置文件 docker run -d \--name scylla \scylladb/…

Android 16应用适配指南

Android 16版本特性介绍 https://developer.android.com/about/versions/16?hlzh-cn Android 16 所有功能和 API 概览 https://developer.android.com/about/versions/16/features?hlzh-cn#language-switching Android 16 发布时间 Android 16 适配指南 Google开发平台&…

2.2goweb解析http请求信息

Go语言的net/http包提供了一些列用于表示HTTP报文的解构。我们可以使用它处理请求和发送响应。其中request结构体代表了客户端发生的请求报文。 核心字段获取方法 1. 请求行信息 通过 http.Request 结构体获取&#xff1a; func handler(w http.ResponseWriter, r *http.Req…

本地部署大模型(ollama模式)

分享记录一下本地部署大模型步骤。 大模型应用部署可以选择 ollama 或者 LM Studio。本文介绍ollama本地部署 ollama官网为&#xff1a;https://ollama.com/ 进入官网&#xff0c;下载ollama。 ollama是一个模型管理工具和平台&#xff0c;它提供了很多国内外常见的模型&…