说明
笔者使用的pyecharts版本是1.7.1,如果使用0.x版本不知道是否可行,因为两个版本代码差异较大。
问题描述:
在pyecharts基于Bmap百度地图绘制可视化地图数据时,根据地名和数据值,例如(北京,200),(天津,45)。在该位置显示散点,在散点上方显示该数据值。显示时发现,显示的数值不是给定的数据值,而是纬度值。如图:
可以看到上图,每个散点上对应的有值,但是这些值不是我给定的数据值,发现是这个点的纬度坐标。
问题解决:
通过查看官方文档发现,在LabelOpts标签配置项里有一个formatter参数,该参数支持字符串模板和回调函数两种形式,其中字符串模板显示有四个选项:{a}(系列名称),{b}(数据名称),{c}(数值数组), {d}(无)。如下图:
发现可以使用formatter=‘{c}’显示数值,将其写入LabelOpts里,.add()代码如下:
.add(
type_="effectScatter",
series_name="",
data_pair=data,
symbol_size=10,
effect_opts=opts.EffectOpts(),
label_opts=opts.LabelOpts(
position="top",
is_show=True, #is_show是否显示标签,点上面的内容
formatter='{c}',
),
itemstyle_opts=opts.ItemStyleOpts(),
is_selected=True, #选中图例
)
运行尝试一下,如图:
发现每个散点上方显示的的一个数组[经度值,纬度值,数据值],但是我只想要显示数据值。
笔者查了很多帖子最后又查了官方文档,发现可以使用回调函数解决。
代码如下:
首先要导入一个包:
from pyecharts.commons.utils import JsCode
然后为formatter参数写回调函数,.add()代码如下:
.add(
type_="effectScatter",
series_name="",
data_pair=data,
symbol_size=10,
effect_opts=opts.EffectOpts(),
label_opts=opts.LabelOpts(
position="top",
is_show=True, #is_show是否显示标签,点上面的内容
formatter=JsCode( #formatter为标签内容格式器{a}:系列名;{b}:数据名;{c}:数值数组也可以是回调函数
"""function(params) {
if ('value' in params.data) {
return params.data.value[2];
}
}"""
),#显示数据,可以去掉经纬度只显示数值return params.data.value[2] + ': ' + params.data.value[0]+': ' + params.data.value[1];
),
itemstyle_opts=opts.ItemStyleOpts(),
is_selected=True, #选中图例
)
通过params.data.value[i]可以显示数组对应的值,例如params.data.value[0]显示经度值;params.data.value[1]显示纬度值;params.data.value[2]显示数据值。params.data.name可以显示数据名。
运行看一下,如图:
可以看到,显示的正是数据值。
当然,在选中标签里也可以使用formatter回调函数,例如,当鼠标移动到西安对应的散点时,会显示一个框,里面有地名和数据值,如图:
实现代码如下,.set_global_opts():
.set_global_opts(
title_opts=opts.TitleOpts(
title="分布图",
pos_left="center",
title_textstyle_opts=opts.TextStyleOpts(color="#fff"), #文字样式配置
),
tooltip_opts=opts.TooltipOpts( #标签配置,选中某一个点显示的框
trigger="item", #触发类型,item主要用于散点图
formatter=JsCode( #显示提示框formatter为标签内容格式器{a}:系列名;{b}:数据名;{c}:数值数组也可以是回调函数
"""function(params) {
if ('value' in params.data) {
return params.data.name + ':' + params.data.value[2];
}
}"""
),#显示数据,可以去掉经纬度,只显示数值return params.data.value[2] + ': ' + params.data.value[0]+': ' + params.data.value[1];
),
最后看一下我的数据:
data = [
["海门", 29],
["鄂尔多斯", 112],
["招远", 70],
["舟山", 29],
["齐齐哈尔", 35],
["盐城", 70],
["赤峰", 100],
["青岛", 80],
["金昌", 119],
["泉州", 45],
["日照", 18],
["石家庄", 65],
["南京", 93],
["拉萨", 200],
["南昌", 30],
["西安", 54],
["乌鲁木齐", 40],
["呼和浩特", 11],
["重庆", 35],
["成都", 49],
["长沙", 50],
["昆明", 10],
["三亚", 5],
]