前言
我们有时会拿到一些数据与国家或者地区密切相关,故在地图上将其可视化会更为直观,同时也会提高数据分析的效率。
利用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")
)
上述代码中自定义数据区间后,每个数据区间对应的颜色均为我手动划分,曾尝试过如何给已划分好的数据区间自动分配颜色,但都失败了,欢迎各位大佬补充~