From 7219b815731d70703073f877910c7518de545e4e Mon Sep 17 00:00:00 2001 From: HuangHai <10402852@qq.com> Date: Mon, 10 Mar 2025 08:31:49 +0800 Subject: [PATCH] 'commit' --- AI/Text2Sql/TestDrawEcharts.py | 73 ++++++++++++++++ AI/Text2Sql/Util/EchartsUtil.py | 79 ++++++++++++++++++ .../__pycache__/EchartsUtil.cpython-310.pyc | Bin 0 -> 2732 bytes AI/Text2Sql/YunXiao.py | 15 ++-- 4 files changed, 162 insertions(+), 5 deletions(-) create mode 100644 AI/Text2Sql/TestDrawEcharts.py create mode 100644 AI/Text2Sql/Util/EchartsUtil.py create mode 100644 AI/Text2Sql/Util/__pycache__/EchartsUtil.cpython-310.pyc diff --git a/AI/Text2Sql/TestDrawEcharts.py b/AI/Text2Sql/TestDrawEcharts.py new file mode 100644 index 00000000..6c34603a --- /dev/null +++ b/AI/Text2Sql/TestDrawEcharts.py @@ -0,0 +1,73 @@ +import os +from pyecharts import options as opts +from pyecharts.charts import Bar + +def generate_bar_chart_from_result(result, x_column: str, y_column: str, output_file: str = "bar_chart.html"): + """ + 根据结果集生成柱状图并保存为 HTML 文件。 + + 参数: + result: 结果集,通常是一个列表(字典格式)。 + x_column (str): 作为 X 轴的列名。 + y_column (str): 作为 Y 轴的列名。 + output_file (str): 输出 HTML 文件名(默认 "bar_chart.html")。 + """ + try: + # 如果结果集为空,直接返回 + if not result: + raise ValueError("结果集为空,无法生成图表!") + + # 检查列名是否存在 + if x_column not in result[0]: + raise ValueError(f"X 轴列名 '{x_column}' 不存在!") + if y_column not in result[0]: + raise ValueError(f"Y 轴列名 '{y_column}' 不存在!") + + # 提取 X 轴和 Y 轴数据 + x_axis_data = [f"{row['学段']} - {row['科目']}" for row in result] # 组合学段和科目作为 X 轴 + y_axis_data = [row[y_column] for row in result] + + print("X 轴数据:", x_axis_data) + print("Y 轴数据:", y_axis_data) + + # 创建柱状图 + bar = Bar() + bar.add_xaxis(x_axis_data) + bar.add_yaxis("课程数量", y_axis_data) + + # 设置全局配置 + bar.set_global_opts( + title_opts=opts.TitleOpts(title="学段-科目课程数量柱状图"), + xaxis_opts=opts.AxisOpts(name="学段-科目", axislabel_opts=opts.LabelOpts(rotate=45)), # X 轴标签旋转 45 度 + yaxis_opts=opts.AxisOpts(name="课程数量"), + legend_opts=opts.LegendOpts(is_show=True) + ) + + # 保存为 HTML 文件 + bar.render(output_file) + print(f"柱状图已保存为 {output_file}") + + # 检查文件是否存在 + if os.path.exists(output_file): + print("文件生成成功!") + else: + print("文件生成失败!") + except Exception as e: + print(f"生成柱状图时发生错误: {e}") + + +# 示例数据 +result = [ + {"学段": "小学", "科目": "语文", "课程数量": 120}, + {"学段": "小学", "科目": "数学", "课程数量": 100}, + {"学段": "初中", "科目": "语文", "课程数量": 150}, + {"学段": "初中", "科目": "数学", "课程数量": 130}, +] + +# 生成柱状图 +generate_bar_chart_from_result( + result, + x_column="学段", + y_column="课程数量", + output_file="d:/lesson_bar_chart.html" +) \ No newline at end of file diff --git a/AI/Text2Sql/Util/EchartsUtil.py b/AI/Text2Sql/Util/EchartsUtil.py new file mode 100644 index 00000000..1241cc5e --- /dev/null +++ b/AI/Text2Sql/Util/EchartsUtil.py @@ -0,0 +1,79 @@ +import os +from pyecharts import options as opts +from pyecharts.charts import Bar +from pyecharts.commons.utils import JsCode + + +def generate_bar_chart_from_result(result, x_columns: list, y_columns: list, output_file: str = "bar_chart.html"): + """ + 根据结果集生成柱状图并保存为 HTML 文件。 + + 参数: + result: 结果集,通常是一个列表(字典格式)。 + x_columns (list): 作为 X 轴的列名列表。 + y_columns (list): 作为 Y 轴的列名列表。 + output_file (str): 输出 HTML 文件名(默认 "bar_chart.html")。 + """ + try: + # 如果结果集为空,直接返回 + if not result: + raise ValueError("结果集为空,无法生成图表!") + + # 检查列名是否存在 + for col in x_columns + y_columns: + if col not in result[0]: + raise ValueError(f"列名 '{col}' 不存在!") + + # 提取 X 轴数据(动态组合多列) + x_axis_data = [" - ".join(str(row[col]) for col in x_columns) for row in result] + # 提取 Y 轴数据 + y_axis_data = [row[y_columns[0]] for row in result] # 目前只支持一个 Y 轴列 + + + + # 为每个柱状图设置不同颜色 + colors = [ + "#5470C6", "#91CC75", "#EE6666", "#73C0DE", "#3BA272", "#FC8452", "#9A60B4", "#EA7CCC" + ] # 自定义颜色列表 + # 创建柱状图并配置布局 + bar = Bar() + bar.add_xaxis(x_axis_data) + bar.add_yaxis( + series_name=y_columns, + y_axis=y_axis_data, + bar_width="30%", # 控制柱宽 + itemstyle_opts=opts.ItemStyleOpts( + color=JsCode(f''' + function(params) {{ + var colorList = {colors}; + return colorList[params.dataIndex % colorList.length]; + }} + ''') + ) + ) + bar.set_global_opts( + xaxis_opts=opts.AxisOpts( + name=" - ".join(x_columns), + axislabel_opts=opts.LabelOpts(rotate=45), + boundary_gap=True, # 开启分类间隙 + splitline_opts=opts.SplitLineOpts(is_show=False) + ), + yaxis_opts=opts.AxisOpts(name=y_columns), + legend_opts=opts.LegendOpts(is_show=True) + ) + + # 确保目标目录存在 + if not os.path.exists(os.path.dirname(output_file)): + os.makedirs(os.path.dirname(output_file)) + + # 保存为 HTML 文件 + bar.render(output_file) + print(f"柱状图已保存为 {output_file}") + + # 检查文件是否存在 + if os.path.exists(output_file): + print("文件生成成功!") + else: + print("文件生成失败!") + except Exception as e: + print(f"生成柱状图时发生错误: {e}") \ No newline at end of file diff --git a/AI/Text2Sql/Util/__pycache__/EchartsUtil.cpython-310.pyc b/AI/Text2Sql/Util/__pycache__/EchartsUtil.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..b086d76befd9184f328a2a413fb99924df8810bf GIT binary patch literal 2732 zcmb7G>u(fQ6u)<7c6WC6K`9^<2$}c@><61#9+is3vebyFuM|PYlFiUN-7e1VEO%z< zw(gqpP*!6D1QoO(Tce4XD87PKs{RMY&-2ypw*ACcLyUON-O`qa8t-QAo_ij@d+s^s zo*5?=(+G^;+J8-7iV*TUE|!iEES`YJeF`Q<7`2Ik|B_9!k|9&1Wn0MxjDVmOJD3d_ zA)q5HXsIj&k7|Vnf-KCm69GeGw3j5JbAU#kO;A7NItPrFHnSvTSb zO`hr>G`ZJ0=w)p`Tuk*lb|IT{{qXPt8F30;zTl+>GPc#PAnN?UW8ovi;}$6)BNHX! zhCDdJae9naNQJH@yUBs3vQkn?aG(})gz|MDmrKexVai1r^$tf)k^#yBEOO|Rc!M|?|(%{7o#jDH2 z+*Fb$=md3-d9mv9r5xO;+Kf`rU%^(FDa2bj ze2tQFn39n=$kvv^w=njTm%*YOem#tK4QhxEk;M9f0pZtl81?E8^|3E!uAQxabYX7% z&6#&E)hnm#m%g5P`)Y0c=h_cfr+>Lv`{Mlc+heOzIOHZ(PNr0ubnzp zfA6bKK_eWu+=A_O>I;C^r{0+x{jfGUSwDYedUAAn^7C5d-0Z|>*QYAAFV5B8n5IDsGqCW zzkRO}VhFB?!ch*HAO#hs#+meug*YrW>eG{B5ct{!2-VSkRJt{g#wM@=9``|*(xgNV z#NUF8UnSyhP$r##s>Hi7LC;8sCAi@74OxF!zYRzNTfCr~5okS3M-eDorXHz~5^VwV zeT0(35+eXWu{p>X8p)Sh+k6@B{$=2BXXrAy(Z0L0kGcCD{%YR~nOwTZ$))?c_Vn$w zie7u~VY}}|FJt$0i{{}X-I^cv!#mPe&MM~lPTbr@SESLkWJIvJ=~=0T5T^#XlT9_M zt96I%^qaQ369_1dekYp;@)i_0sT^`Lxdi3VJ;7}rgg+j`sR<@uTeK3}ViX=EBkc(A z|2DlVm;rziSy=;w$ckE~CFpF7w7_pZ6I7&}F9V%~B%I`!aqtwgD)_=vj!+xmanZ#! zB%zLk9@x62qb<1&i0zLglO0=u=laIuwD!dms(^ zev$C!?Y+EUK(YZVfv7LJuCIAU?$Ahxl`(%O| zp^Tey2c02+R1nLEBa&?%v}|E$L=QTJ95eZFDsASCxSO{#o}I}xU?G_;h$$Od5$zf# z+VCPBu`Q@LCIp51KzFg}e*ev4(=Dt*k!ZT}y}5F__Vy*{33o|qpL{+0-KQwg!RC%m zUO#uWcIpf;=idEb_R5t`{n^ASU)yKe1*@BLhjV-@8)1{NlyJB~3V(eC17*baK;U{Y zaL-}f@U|MuT+2(PZReml9~89<4lCr%0FFCHSpTv