Pyecharts Geo在地图上添加坐标点


在上一篇文章已经实现了创建一个中国地区的地图
创建地图: https://blog.csdn.net/weixin_41955254/article/details/118896870?spm=1001.2014.3001.5502
这篇文章将介绍怎么在地图上添加坐标点

添加坐标点

输入坐标点

想要给图片输入坐标点,我们必须知道坐标点是由哪几个属性组成的

属性名属性值格式
坐标点名称字符型(具有唯一性)
坐标点经度10进制数字
坐标点维度10进制数字

提供一个好用的网站可以批量将度分秒转换成10进制的网站
https://www.opengps.cn/Map/Tools/GPSConvert.aspx
名称确定坐标点的唯一性,经纬度确定位置
在了解清楚之后我们可以用Geo的内置函数add_coordinate添加坐标点

def add_coordinate(
    # 坐标地点名称
    name: str,

    # 经度
    longitude: Numeric,

    # 纬度
    latitude: Numeric,
)

具体代码如下

#g是上篇文章创建的地图,默认已经配置好了,大家可以到上一篇文章里粘贴一下最后的代码再使用
g.add_coordinate("第一个坐标点",114.9175,36.3622222)
g.add_coordinate("第二个坐标点",121.7825,31.1705555)
#添加两个坐标点是为了方便后面

将坐标点添加入系列并配置系列

但是当大家运行程序后会发现地图上并没有多什么东西,因为这里添加的是坐标点,我们并没有给坐标点添加一个系列也没有给坐标点附加图形样式,所以在地图上并不会显示,但这两个点确确实实添加了上去
不慌,因为这样我们可以对这些点进行分类,还能让不同类的坐标点以不同的形式展现

def add(
    # 系列名称,用于 tooltip 的显示,legend 的图例筛选。
    series_name: str,

    # 数据项 (坐标点名称,坐标点值)
    data_pair: Sequence,

    # Geo 图类型,有 scatter, effectScatter, heatmap, lines 4 种,建议使用
    # from pyecharts.globals import GeoType
    # GeoType.GeoType.EFFECT_SCATTER,GeoType.HEATMAP,GeoType.LINES
    type_: str = "scatter",

    # 是否选中图例
    is_selected: bool = True,

    # 标记图形形状
    symbol: Optional[str] = None,

    # 标记的大小
    symbol_size: Numeric = 12,

    # 每个点的大小,在地理坐标系(coordinateSystem: 'geo')上有效。
    blur_size: types.Numeric = 20,

    # 每个点模糊的大小,在地理坐标系(coordinateSystem: 'geo')上有效。
    point_size: types.Numeric = 20,

    # 系列 label 颜色
    color: Optional[str] = None,

    # 是否是多段线,在画 lines 图情况下
    is_polyline: bool = False,

    # 是否启用大规模线图的优化,在数据图形特别多的时候(>=5k)可以开启
    is_large: bool = False,

    # 特效尾迹的长度。取从 0 到 1 的值,数值越大尾迹越长。默认值 0.2
    trail_length: Numeric = 0.2,

    # 开启绘制优化的阈值。
    large_threshold: Numeric = 2000,

    # 配置该系列每一帧渲染的图形数
    progressive: types.Numeric = 400,

    # 启用渐进式渲染的图形数量阈值,在单个系列的图形数量超过该阈值时启用渐进式渲染。
    progressive_threshold: types.Numeric = 3000,

    # 标签配置项,参考 `series_options.LabelOpts`
    label_opts: Union[opts.LabelOpts, dict] = opts.LabelOpts(),

    # 涟漪特效配置项,参考 `series_options.EffectOpts`
    effect_opts: Union[opts.EffectOpts, dict] = opts.EffectOpts(),

    # 线样式配置项,参考 `series_options.LineStyleOpts`
    linestyle_opts: Union[opts.LineStyleOpts, dict] = opts.LineStyleOpts(),

    # 提示框组件配置项,参考 `series_options.TooltipOpts`
    tooltip_opts: Union[opts.TooltipOpts, dict, None] = None,

    # 图元样式配置项,参考 `series_options.ItemStyleOpts`
    itemstyle_opts: Union[opts.ItemStyleOpts, dict, None] = None,

    # 这个配置相对非常复杂(参照地址: https://www.echartsjs.com/zh/option.html#series-custom.renderItem)
    render_item: types.JsCode = None,

    # 这个配置相对非常复杂(参照地址: https://www.echartsjs.com/zh/option.html#series-custom.encode)
    encode: types.Union[types.JsCode, dict] = None,
)

通过add函数,为坐标点添加系列,并且添加各种属性配置
这篇文章暂时先不讲tooltip_opts里的formatter配置,这个配置很重要所以单独成立一篇文章来讲
挑了几个我常用的属性给大家介绍

g.add(series_name='系列1'
      , data_pair=[("第一个坐标点",'非常的大')]#系列里需要的点用列表框住多个元组达到批量输入的效果[(坐标点1,坐标点1的值),(坐标点2,坐标点2的值),(坐标点3,坐标点3的值)]
      , symbol_size=35#系列内显示点的大小
      , color="black"#系列内显示点的颜色
      ,is_selected=True#html文件运行第一时间是否选中该系列
    )
g.add(series_name='系列2'
      , data_pair=[("第二个坐标点",'非常的小')]
      , symbol_size=5
      , color="white"
      ,is_selected=False
    )

生成的结果如下
在这里插入图片描述
其实这里有个小bug,我也不知道是我的问题还是这个库的一个bug
当添加多个系列的时候,颜色配置会出现紊乱
紊乱的顺序刚好和你配置的顺序倒过来,比如你配置的时候是红橙黄绿蓝,那么最后呈现的颜色就会是蓝绿黄橙红,这一点大家还是要注意一下的
最后生成的这个图说实在的,丑了点,现在给他美化一下

加一点点小细节给图片美化一下

我们不难跳出这个图的一些毛病
1、坐标点上有一行长长的数字
2、最上边图例和坐标点的位置重叠了
3、图例选中之后颜色与背景不匹配
上述三点,我们需要调节全局配置项系列配置项
官网里面有一张示意图很重要,建议大家可以保存下来
在这里插入图片描述
这两个配置项里面有很多的配置项,这里很难一一讲解,只能说,需要改变某一项的属性,我们首先先去查官网,接下来我将解决我上面提出的三个毛病

让坐标点不显示value

g.set_series_opts(label_opts=opts.LabelOpts(is_show=False))

调整图例位置,向右靠拢

g.set_global_opts(legend_opts=opts.LegendOpts(pos_right="10px"))

改变图例选中与非选中时候的颜色色系

g.set_global_opts(legend_opts=opts.LegendOpts(
    inactive_color="white",
    textstyle_opts=opts.TextStyleOpts(color="orange")
))

inactive_color:系列未被选中时的颜色
系列颜色被选中时全局配置项里有一个文本配置项,我们需要用到pyecharts.optinons里的TextStyleOpts函数对文本颜色进行配置
最后生成的结果如下:
在这里插入图片描述
奉上完整代码:

import webbrowser
from pyecharts import options as opts
from pyecharts.charts import Geo
g = (Geo(
    init_opts=opts.InitOpts(width="900px",height="900px",page_title="12345",bg_color="#404a59")#颜色是str的16进制或英文都可以
).add_schema(
        maptype="china",#地图类型
        itemstyle_opts=opts.ItemStyleOpts(
            color="#323c48"#背景颜色
         , border_color="white")#边界线颜色
        ))
g.add_coordinate("第一个坐标点",114.9175,36.3622222)
g.add_coordinate("第二个坐标点",121.7825,31.1705555)

g.add(series_name='系列1'#系列名
      , data_pair=[("第一个坐标点",'非常的大')]#系列里需要的点用列表框住多个元组达到批量输入的效果[(坐标点1,坐标点1的值),(坐标点2,坐标点2的值),(坐标点3,坐标点3的值)]
      , symbol_size=35#系列内显示点的大小
      , color="black"
      ,is_selected=True
    )
g.add(series_name='系列2'
      , data_pair=[("第二个坐标点",'非常的小')]
      , symbol_size=5
      , color="white"
      ,is_selected=False
    )
g.set_series_opts(
    label_opts=opts.LabelOpts(
        is_show=False
    ))
g.set_global_opts(
    title_opts=opts.TitleOpts(
        title='12345678767545323',#主标题内容
        subtitle='324567876564534',#副标题内容
        item_gap=15,#主副标题的间距
        title_textstyle_opts=opts.TextStyleOpts(
            color="white",#主标题颜色
            font_weight="bolder",#主标题加粗
            font_size=40#主标题字体大小
        ),
        subtitle_textstyle_opts=opts.TextStyleOpts(
            color='gray',#副标题颜色
            font_weight="bolder",#副标题加粗
            font_size=15))#副标题副标题字体大小
        ,legend_opts=opts.LegendOpts(pos_right="10px",inactive_color="white",textstyle_opts=opts.TextStyleOpts(color="orange"))
    )
result=g.render()#会在你py文件同目录下生成一个html文件,也可在括号内输入保存路径,用浏览器打开html文件可以查看
webbrowser.open(result)

webbrowser是我觉得非常好用的一个模块,程序运行完自动打开html,推荐给大家
这是小弟学习pyecharts的第二篇笔记,不足之处还请各位大佬多多指点!!!
下一期文章: 如何更改坐标点提示框的文字格式,达到换行空行的效果