科研用代码(3)通过流程分解,轻松看懂和使用pyecharts库 禁止转载

应用场景说明:Pyecharts是一个用于在Python中生成交互式可视化图表的库。它基于Echarts.js库,提供了多种类型的图表和丰富的配置选项,可以帮助开发者轻松地创建各种精美的可视化效果。然而作者身边许多python新手却认为这个库过于复杂,不便于新手理解。从图1可以发现为了绘制像图2一样的简单图像需要生成一个实例化对象,调用5个不同的属性,还要记住那么多不同参数,许多新手因此就望而却步了。

       图1   pyecharts官方demo代码

    图2pyecharts官方demo的图片

基于此,本文提出一种流程分解的方法作为解决方案,其思路如下:

①简化代码(具体操作包括①将每个属性单独书写出来,去除不同参数间的空行与空格)

from pyecharts import options as opts
from pyecharts.charts import Bar
from pyecharts.commons.utils import JsCode
from pyecharts.faker import Faker

c = Bar(init_opts=opts.InitOpts(bg_color={"type": "pattern", "image": JsCode("img"), "repeat": "no-repeat"}))
c.add_xaxis(Faker.choose())
c.add_yaxis("商家A", Faker.values())
c.add_yaxis("商家B", Faker.values())
c.set_global_opts(title_opts=opts.TitleOpts(title="Bar-背景图基本示例", subtitle="我是副标题", title_textstyle_opts=opts.TextStyleOpts(color="white")))
c.add_js_funcs("var img = new Image(); img.src = '';")
c.render("bar_base_with_custom_background_image.html")

图3 简化的代码

②建立流程模型

图4 提炼出的pyecharts库作业流程

 ③基于流程模型设计自己的函数

虽然对代码进行了一定的优化,但图3的代码仍存在一定的理解难度,举例而言:set_global_opts属性中虽然只有1个参数,但存在着3层嵌套,新手容易看晕乎。因此我们可以把这些参数提取出来,通过连续调用3次属性来实现相同的功能。

c.set_global_opts(title_opts=opts.TitleOpts(title="Bar-背景图基本示例", subtitle="我是副标题", title_textstyle_opts=opts.TextStyleOpts(color="white")))

图5 要提取属性的代码

为了打印出这个属性中的参数,我们可使用正则表达式,具体的代码如图6所示

import re

property_str = 'c.set_global_opts(title_opts=opts.TitleOpts(title="Bar-背景图基本示例", subtitle="我是副标题", title_textstyle_opts=opts.TextStyleOpts(color="white")))'

pattern = r"title_opts=opts.TitleOpts\(([^)]+)\)"
result = re.search(pattern, property_str)

if result:
    options_str = result.group(1)
    pattern_param = r"(\w+)=([^,]+)"
    parameters = re.findall(pattern_param, options_str)
    print("Parameters:")
    for key, value in parameters:
        print("{}: {}".format(key, value))
else:
    print("No match found.")

图6通过正则表达式提取参数

 图7 参数的输出结果

解释下代码中出现的每个正则表达式的含义:

  1. pattern = r"title_opts=opts.TitleOpts\(([^)]+)\)" 这个正则表达式的作用是匹配包含在 title_opts=opts.TitleOpts(...) 中的内容。

    • title_opts=opts.TitleOpts:匹配字符串 "title_opts=opts.TitleOpts" 字面值。
    • \(:匹配一个左括号 "("。
    • ([^)]+):捕获组,匹配除 ")" 以外的任意字符一次或多次。
    • \):匹配一个右括号 ")"。
  2. result = re.search(pattern, property_str) 使用 search() 方法在 property_str 字符串中查找与 pattern 正则表达式匹配的部分。

  3. if result: 检查是否找到了匹配结果。

  4. options_str = result.group(1) 获取正则表达式匹配结果中的第一个捕获组,即 "([^)]+)" 部分,即包含在括号内的内容。

  5. _param = r"(\w+)=([^,]+)" 这个正则表达式的作用是匹配逗号分隔的键值对,例如 "key=value"

    • (\w+):捕获组,匹配一个或多个字母、数字、下划线字符。
    • =:匹配一个号 "="。
    • ([^,]+):捕获组,匹配除逗号 "," 以外的任意字符一次或多次。
  6. parameters = re.findall(pattern_param, options_str) 使用 findall() 方法在 options_str 字符串中查找所有与 pattern_param 正则表达式匹配的结果,并返回一个列表。

  7. print("Parameters:") 输出参数的标题。

  8. for key, value in parameters: 遍历 parameters 列表中的每个键值对。

  9. print("{}: {}".format(key, value)) 格式化输出每个键值对的内容,用冒号分隔键和值。

④构建自己的类与函数

为便于理解,仅处理实例化和x轴的部分(见图8),为了避免重复开发,我们将各参数的值储存在类中,每次使用时调用自己所需的类的名字,这样可以大幅降低代码的阅读难度(见图9)

c = Bar(init_opts=opts.InitOpts(bg_color={"type": "pattern", "image": JsCode("img"), "repeat": "no-repeat"}))
c.add_xaxis(Faker.choose())

图8  拟处理的数据

#实例化的属性
class instantiat:
    #第一种写法
    init_opts = "init_opts = opts.InitOpts({bg_colortype': 'pattern', 'image': JsCode('img'), 'repeat': 'no-repeat'})"
    #第二种写法
    init_opts_bg_colortype="init_opts = opts.InitOpts({bg_colortype': 'pattern'}"
    init_opts_image = "init_opts = opts.InitOpts({image': JsCode('img')}"
    init_opts_repeat= "init_opts = opts.InitOpts({repeat': 'no-repeat'"
#x,y轴的属性
class x_axis:
    choose=Faker.choose()
    value=Faker.values()

def bar_01():
    bar_01_instantiat=instantiat.init_opts  #获取实例化对象属性
    bar_01_x_value=x_axis.choose #获取x轴对象
    c = Bar(bar_01_instantiat=instantiat.init_opts)
    c.add_xaxis(bar_01_x_value)

图9  建立的类和函数

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值