Dify + ECharts 实战:用Python代码执行组件搞定多维数据可视化(附完整DSL文件)

Dify + ECharts 实战:用Python代码执行组件搞定多维数据可视化(附完整DSL文件) Dify ECharts 实战用Python代码执行组件实现多维数据可视化当Dify平台的内置ECharts插件无法满足复杂数据可视化需求时代码执行组件为我们打开了一扇新的大门。本文将带你深入探索如何通过Python代码直接调用ECharts库构建一个从数据解析到图表生成的完整工作流。1. 为什么需要代码执行组件Dify平台的ECharts插件虽然开箱即用但在处理多维数据时往往力不从心。比如当我们需要同时展示多个维度的对比数据或者需要自定义复杂的图表交互时内置插件就显得捉襟见肘了。代码执行组件的优势在于灵活性完全控制图表配置的每个细节扩展性可以集成任何Python支持的库复用性通过DSL文件分享配置团队协作更高效提示代码执行组件需要一定的Python基础但本文提供的示例代码即使对初学者也很友好。2. 环境准备与基础配置在开始之前确保你的Dify环境已经满足以下条件已安装代码执行组件拥有Python 3.7运行环境网络权限允许访问PyPI仓库安装依赖首先我们需要在代码执行组件中配置Python环境# 基础环境检查 import sys print(fPython版本: {sys.version}) print(f可用的模块: {sys.modules.keys()})如果运行正常接下来安装必要的依赖pip install pyecharts pandas3. 数据准备与解析多维数据可视化的第一步是正确处理数据源。我们以CSV格式为例展示如何构建一个通用的数据解析器。假设我们有以下格式的销售数据城市,1月,2月,3月,4月,5月 北京,12318,12408,8418,6299,12318 上海,11326,11802,6570,6299,11326 广州,8035,8418,6360,6001,8035对应的Python解析代码如下import csv from io import StringIO def parse_csv(csv_data): 解析CSV数据并转换为ECharts需要的格式 reader csv.DictReader(StringIO(csv_data)) data list(reader) if not data: return None # 自动识别维度 dimensions list(data[0].keys()) categories dimensions[1:] # 假设第一列是分类 series [] for row in data: series.append({ name: row[dimensions[0]], type: bar, data: [float(row[cat]) for cat in categories] }) return { categories: categories, series: series, title: f{len(data)}个城市销售数据对比 }4. 构建多维可视化图表有了解析后的数据我们可以创建更丰富的可视化效果。以下是一个支持多维对比的柱状图实现from pyecharts import options as opts from pyecharts.charts import Bar def create_multi_dimension_chart(parsed_data): 创建多维对比柱状图 bar Bar() # 添加X轴数据 bar.add_xaxis(parsed_data[categories]) # 添加系列数据 for series in parsed_data[series]: bar.add_yaxis( series[name], series[data], label_optsopts.LabelOpts(positionright) ) # 全局配置 bar.set_global_opts( title_optsopts.TitleOpts(titleparsed_data[title]), tooltip_optsopts.TooltipOpts(triggeraxis, axis_pointer_typeshadow), legend_optsopts.LegendOpts(pos_leftright), xaxis_optsopts.AxisOpts( type_category, axislabel_optsopts.LabelOpts(rotate45) ) ) return bar这段代码会生成一个支持以下特性的图表多系列数据对比自适应标签显示交互式提示框自动图例位置调整5. 完整工作流集成现在我们将所有部分整合到Dify的代码执行组件中import json from pyecharts.charts import Bar from pyecharts import options as opts import csv from io import StringIO def main(csv_data): # 1. 解析数据 parsed_data parse_csv(csv_data) if not parsed_data: return {error: 数据解析失败} # 2. 创建图表 chart create_multi_dimension_chart(parsed_data) # 3. 生成配置 chart_config chart.dump_options() # 4. 返回结果 return { result: fecharts\n{json.dumps(chart_config, ensure_asciiFalse)}\n, data_preview: parsed_data # 可选返回解析后的数据结构 } def parse_csv(csv_data): 数据解析函数 # 同上文parse_csv实现 pass def create_multi_dimension_chart(parsed_data): 图表创建函数 # 同上文create_multi_dimension_chart实现 pass6. 高级技巧与优化6.1 动态图表类型切换通过修改代码我们可以实现同一个数据集在不同图表类型间的切换def create_dynamic_chart(parsed_data, chart_typebar): 支持动态图表类型 if chart_type bar: chart Bar() elif chart_type line: chart Line() else: raise ValueError(不支持的图表类型) chart.add_xaxis(parsed_data[categories]) for series in parsed_data[series]: if chart_type bar: chart.add_yaxis(series[name], series[data]) elif chart_type line: chart.add_yaxis(series[name], series[data], symbolcircle, symbol_size8) # 其他配置... return chart6.2 数据预处理在可视化前对数据进行预处理可以显著提升图表效果def preprocess_data(parsed_data): 数据预处理 # 标准化处理 for series in parsed_data[series]: max_val max(series[data]) if max_val 0: series[data] [round(v/max_val, 2) for v in series[data]] # 添加百分比标签 parsed_data[yaxis_formatter] {value}% return parsed_data7. DSL文件分享与复用将配置保存为DSL文件可以实现团队协作和快速复用。以下是DSL文件的关键部分示例{ components: { code_executor: { language: python, dependencies: [pyecharts, pandas], entry_point: main, parameters: { csv_data: { type: string, description: CSV格式的输入数据 } } } }, workflow: { steps: [ { type: file_upload, output: raw_data }, { type: code_executor, input: { csv_data: {{raw_data}} } } ] } }在实际项目中我发现将常用图表配置封装成DSL模板可以节省大量重复工作。比如销售数据看板、用户行为分析等场景都可以通过修改DSL中的几个参数快速适配。