根据数据生成地图并着色

文章介绍了如何利用pyecharts库在Python中创建世界地图并进行数据可视化,包括设置数据范围、自定义颜色区间以及隐藏国家名等,以提高数据分析的直观性。还讨论了如何手动定义数据区间并匹配颜色,以更精确地展示数据分布。
摘要由CSDN通过智能技术生成

前言

我们有时会拿到一些数据与国家或者地区密切相关,故在地图上将其可视化会更为直观,同时也会提高数据分析的效率。

利用Map绘制地图(以世界地图为例)

数据形式如下,表中数据是我乱编的。

一.

#导入必要的库
import pandas as pd  
from pyecharts.charts import Map
from pyecharts import options as opts 

#准备数据
data = pd.read_excel("数据.xlsx")
country = list(data["国家"])
number = list(data["数值"])
data_lis=[list(x) for x in zip(country,number)]


c = (
    Map(init_opts=opts.InitOpts(width="1800px", height="1500px"))  #初始化地图大小
    .set_global_opts(
        #title_opts=opts.TitleOpts(title=""),  #根据需要添加适当的标题
        visualmap_opts=opts.VisualMapOpts(
            min_=1,
            max_=158,数据的上下限
            is_piecewise=True, 
            range_text=("High","Low"),
            orient="vertical",
            split_number=8 #将数据区间分为8段
        )
    )
    .add("",data_lis,maptype="world")  #传入数据,地图类型为世界地图,若只需要绘制某一个国家的地图,将world改为对应的国家名即可
    .render("Map.html")
)

上图即是根据数据生成并着色的世界地图,系统将数据自动平均分成了八个数据区间 ,数值越大颜色越深。观察上图我们可以发现,不足的是国家太多,国家名显示在地图上显得非常杂乱。所以我们可以将上述代码修改一下,在

.add("",data_lis,maptype="world")

后面加上

.set_series_opts(
        label_opts=opts.LabelOpts(is_show=False), #去掉国家名
        itemstyle_opts=opts.ItemStyleOpts(color="transparent") #去掉代表国家的小圆点
    )

就可以啦~效果是这样滴

二.

 前面已经提到,数据区间是系统自动平均分配的,但有时候需要我们自定义数据区间该怎么办呢?

import pandas as pd
from pyecharts.charts import Map
from pyecharts import options as opts

data = pd.read_excel("数据.xlsx")
country = list(data["国家"])
number = list(data["数值"])

color_mapping = {
    # 自定义数据分组和颜色
    "[1,17)": "#90C850",
    "[17,34)": "#08b682",
    "[34,50)": "#0f6f5f",
    "[50,63)":"#89c886",
    "[63,82)": "#6AB187",
    "[82,95)": "#FF7F50",
    "[95,116)": "#FF4500",
    "[116,137)": "#FF0000",
    "[137,159)": "#800000",
}

pieces = [
    {"value": 1, "label": "1 to 17", "color": "#90C850"},
    {"value": 2, "label": "17 to 34", "color": "#08b682"},
    {"value": 3, "label": "34 to 50",  "color": "#0f6f5f"},
    {"value": 4, "label": "50 to 63",  "color": "#89c886"},
    {"value": 5, "label": "63 to 82",   "color": "#6AB187"},
    {"value": 6, "label": "82 to 95",   "color": "#FF7F50"},
    {"value": 7, "label": "95 to 116",   "color": "#FF4500"},
    {"value": 8, "label": "116 to 137",   "color": "#FF0000"},
    {"value": 9, "label": "137 to 159",   "color": "#800000"},
]

def classify(number):
    if 1 <= number < 17:
        return 1
    elif 17<= number < 34:
        return 2
    elif 34 <= number < 50:
        return 3
    elif 50 <= number < 63:
        return 4
    elif 63 <= number < 82:
        return 5
    elif 82<= number < 95:
        return 6
    elif 95 <= number < 116:
        return 7
    elif 116 <= number < 137:
        return 8
    elif 137 <= number < 159:
        return 9

data_lis = [[c, classify(n)] for c, n in zip(country, number)]

c = (
    Map(init_opts=opts.InitOpts(width="1800px", height="1200px"))
    .set_global_opts(
        title_opts=opts.TitleOpts(),
        visualmap_opts=opts.VisualMapOpts(
            min_=1,
            max_=159,
            range_text=['High','Low'],
            is_piecewise=True,
            pos_top="middle",
            pos_left="left",
            orient="vertical",
            pieces=pieces
        )
    )
    .add("", data_lis, maptype="world")
    .set_series_opts(
        label_opts=opts.LabelOpts(is_show=False),
        itemstyle_opts=opts.ItemStyleOpts(color="transparent")
    )
    .render("Map.html")
)

上述代码中自定义数据区间后,每个数据区间对应的颜色均为我手动划分,曾尝试过如何给已划分好的数据区间自动分配颜色,但都失败了,欢迎各位大佬补充~

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值