pyecharts通过鼠标事件添加markpoint

最近使用pyecharts绘图遇到了需要给绘制出的图形添加自定义标签功能,查阅有关文档后成功解决了该问题,现在分享出来。使用本文的方法可以实现双击图形上的数据点,为该点创建一个标签,再次双击该标签,标签销毁。

pyecharts的图形对象都有一个add_js_funcs方法,通过该方法可以在html文件中嵌入js脚本,增加html的交互功能。

以line图形举例,下面是示例代码,该代码会创建一个折线图对象,并打开。

import os

import pyecharts.options as opts
from pyecharts.charts import Line

x_data = ["Mon", "Tue", "Wed", "Thu", "Fri", "Sat", "Sun"]
y_data = [820, 932, 901, 934, 1290, 1330, 1320]

line=Line()
line.set_global_opts(
        tooltip_opts=opts.TooltipOpts(is_show=False),
        xaxis_opts=opts.AxisOpts(type_="category"),
        yaxis_opts=opts.AxisOpts(
            type_="value",
            axistick_opts=opts.AxisTickOpts(is_show=True),
            splitline_opts=opts.SplitLineOpts(is_show=True),
        ),
    )
line.add_xaxis(xaxis_data=x_data)
line.add_yaxis(
        series_name="",
        y_axis=y_data,
        symbol="emptyCircle",
        is_symbol_show=True,
        label_opts=opts.LabelOpts(is_show=False),
    )

line.render("basic_line_chart.html")

os.startfile("basic_line_chart.html")

现在增加js_func,具体内容如下,其中chart_id是绘制图形的唯一id,通过

chart_id=line.chart_id获取。
js_func = f"""
    chart_{chart_id}.on('dblclick', function(params) {{
        var opts=option_{chart_id};
        if(params.componentType=="series") {{
            var seriesIndex=params.seriesIndex;
            if (!('markPoint' in opts.series[seriesIndex])) {{
                var markPoint = {{
                    label: {{
                        show: true,
                    }},
                    data: []
                }};
                opts.series[seriesIndex].markPoint = markPoint;
            }}
            var markData={{ name:seriesIndex, coord: params.value, value: params.value[params.value.length-1] }} 
            opts.series[seriesIndex].markPoint.data.push(markData);
            chart_{chart_id}.setOption(opts);
        }} else if(params.componentType=="markPoint") {{
            var seriesIndex=params.seriesIndex;
            var coord=params.data.coord;
            var idxToRemove=opts.series[seriesIndex].markPoint.data.findIndex(function(item) {{
                return item.name == seriesIndex && item.coord[0] === coord[0] && item.coord[1] === coord[1];
            }});
            if (idxToRemove !== -1) {{
                opts.series[seriesIndex].markPoint.data.splice(idxToRemove, 1);
                chart_{chart_id}.setOption(opts);
            }}
        }}
    }});
"""

解释一下上述js_func,该js函数使用了echarts的鼠标事件api接口,dblclick表示双击鼠标触发。当然你也可以修改为click,表示单击触发。

chart_{chart_id}.on('dblclick', function(params)

首先定义变量opts,并将图形的opts赋值给opts。

var opts=option_{chart_id};

对鼠标点击事件的点击对象进行判断,

如果点击对象为series,则获取点击对象的seriesindex,同时检查当前的绘图配置项里面有没有配置标记点,如果没有就需要初始化一下,这里需要构造一个markpoint空字典,将它添加到绘图配置项里,然后定义一个markdata,markdata的name属性设置为seriesindex,coord设置为点击对象的coord,值设置为点击对象的coord的最后一维的值。使用push办法将这个markdata添加到markpoint的data里面,最后通过chart.setOption方法设置markpoint。

当然如果你想自定义markpoint的样式,包括颜色,字体,大小什么的设置,请参照下面的官方文档链接,修改js_func中的markPoint变量。

markPoint官方文档说明

var markPoint = {{
                    label: {{
                        show: true,
                    }},
                    data: []
                }};

如果点击的对象是markpoint,则去寻找当前绘图设置项里面的markpoint.data有没有这个markpoint,如果存在,则删除它,实现双击markpoint可删除的效果。这里就用到了上面为啥将markdata的name属性设置为seriesindex,因为遍历当前绘图设置项里面的markpoint.data里面的item的时候,它是只有name,coord这些属性的,将name设置为seriesindex,实现了对唯一系列项的唯一坐标的校核。

完整代码如下

import os

import pyecharts.options as opts
from pyecharts.charts import Line

x_data = ["Mon", "Tue", "Wed", "Thu", "Fri", "Sat", "Sun"]
y_data = [820, 932, 901, 934, 1290, 1330, 1320]


line = Line()
line.set_global_opts(
    tooltip_opts=opts.TooltipOpts(is_show=False),
    xaxis_opts=opts.AxisOpts(type_="category"),
    yaxis_opts=opts.AxisOpts(
        type_="value",
        axistick_opts=opts.AxisTickOpts(is_show=True),
        splitline_opts=opts.SplitLineOpts(is_show=True),
    ),
)
line.add_xaxis(xaxis_data=x_data)
line.add_yaxis(
    series_name="",
    y_axis=y_data,
    symbol="emptyCircle",
    is_symbol_show=True,
    label_opts=opts.LabelOpts(is_show=False),
)
chart_id = line.chart_id
js_func = f"""
    chart_{chart_id}.on('dblclick', function(params) {{
        var opts=option_{chart_id};
        if(params.componentType=="series") {{
            var seriesIndex=params.seriesIndex;
            if (!('markPoint' in opts.series[seriesIndex])) {{
                var markPoint = {{
                    label: {{
                        show: true,
                    }},
                    data: []
                }};
                opts.series[seriesIndex].markPoint = markPoint;
            }}
            var markData={{ name:seriesIndex, coord: params.value, value: params.value[params.value.length-1] }} 
            opts.series[seriesIndex].markPoint.data.push(markData);
            chart_{chart_id}.setOption(opts);
        }} else if(params.componentType=="markPoint") {{
            var seriesIndex=params.seriesIndex;
            var coord=params.data.coord;
            var idxToRemove=opts.series[seriesIndex].markPoint.data.findIndex(function(item) {{
                return item.name == seriesIndex && item.coord[0] === coord[0] && item.coord[1] === coord[1];
            }});
            if (idxToRemove !== -1) {{
                opts.series[seriesIndex].markPoint.data.splice(idxToRemove, 1);
                chart_{chart_id}.setOption(opts);
            }}
        }}
    }});
"""
line.add_js_funcs(js_func)
line.render("basic_line_chart.html")

os.startfile("basic_line_chart.html")

  • 4
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
根据提供的引用[1],pyecharts treemap 点击事件可以通过添加 on-click 事件来实现。具体实现步骤如下: 1.导入所需模块 ```python from pyecharts.charts import TreeMap from pyecharts import options as opts ``` 2.创建数据 ```python data = [ {"value": 40, "name": "我是A"}, {"value": 20, "name": "我是B"}, {"value": 10, "name": "我是C"}, {"value": 5, "name": "我是D"}, {"value": 3, "name": "我是E"}, {"value": 2, "name": "我是F"}, {"value": 1, "name": "我是G"}, {"value": 1, "name": "我是H"}, {"value": 1, "name": "我是I"}, {"value": 1, "name": "我是J"}, {"value": 1, "name": "我是K"}, {"value": 1, "name": "我是L"}, {"value": 1, "name": "我是M"}, {"value": 1, "name": "我是N"}, {"value": 1, "name": "我是O"}, {"value": 1, "name": "我是P"}, {"value": 1, "name": "我是Q"}, {"value": 1, "name": "我是R"}, {"value": 1, "name": "我是S"}, {"value": 1, "name": "我是T"}, {"value": 1, "name": "我是U"}, {"value": 1, "name": "我是V"}, {"value": 1, "name": "我是W"}, {"value": 1, "name": "我是X"}, {"value": 1, "name": "我是Y"}, {"value": 1, "name": "我是Z"}, ] ``` 3.创建 treemap 并添加 on-click 事件 ```python treemap = ( TreeMap() .add("", data) .set_global_opts(title_opts=opts.TitleOpts(title="Treemap-基本示例", subtitle="我是副标题")) .set_series_opts( label_opts=opts.LabelOpts( position="inside", font_size=12, formatter="{b}", font_style="italic", font_weight="bold", color="white", ), # 添加 on-click 事件 emphasis_label_opts=opts.LabelOpts( position="inside", font_size=12, formatter="{b}", font_style="italic", font_weight="bold", color="white", ).set_display_mode("single"), ) .set_global_opts( tooltip_opts=opts.TooltipOpts(trigger="item", formatter="{b}: {c}") ) ) # 添加 on-click 事件 treemap.on("click", print) # 渲染图表 treemap.render("treemap.html") ``` 在上述代码中,我们通过 `treemap.on("click", print)` 添加了一个 on-click 事件,当用户点击 treemap 中的某个元素时,会触发该事件并打印出被点击元素的信息

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值