pyxllib 0.3.197__py3-none-any.whl → 3.201.1__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (127) hide show
  1. pyxllib/__init__.py +14 -21
  2. pyxllib/algo/__init__.py +8 -8
  3. pyxllib/algo/disjoint.py +54 -54
  4. pyxllib/algo/geo.py +537 -541
  5. pyxllib/algo/intervals.py +964 -964
  6. pyxllib/algo/matcher.py +389 -389
  7. pyxllib/algo/newbie.py +166 -166
  8. pyxllib/algo/pupil.py +629 -629
  9. pyxllib/algo/shapelylib.py +67 -67
  10. pyxllib/algo/specialist.py +241 -241
  11. pyxllib/algo/stat.py +494 -494
  12. pyxllib/algo/treelib.py +145 -149
  13. pyxllib/algo/unitlib.py +62 -66
  14. pyxllib/autogui/__init__.py +5 -5
  15. pyxllib/autogui/activewin.py +246 -246
  16. pyxllib/autogui/all.py +9 -9
  17. pyxllib/autogui/autogui.py +846 -852
  18. pyxllib/autogui/uiautolib.py +362 -362
  19. pyxllib/autogui/virtualkey.py +102 -102
  20. pyxllib/autogui/wechat.py +827 -827
  21. pyxllib/autogui/wechat_msg.py +421 -421
  22. pyxllib/autogui/wxautolib.py +84 -84
  23. pyxllib/cv/__init__.py +5 -5
  24. pyxllib/cv/expert.py +267 -267
  25. pyxllib/cv/imfile.py +159 -159
  26. pyxllib/cv/imhash.py +39 -39
  27. pyxllib/cv/pupil.py +9 -9
  28. pyxllib/cv/rgbfmt.py +1525 -1525
  29. pyxllib/cv/slidercaptcha.py +137 -137
  30. pyxllib/cv/trackbartools.py +251 -251
  31. pyxllib/cv/xlcvlib.py +1040 -1040
  32. pyxllib/cv/xlpillib.py +423 -423
  33. pyxllib/data/echarts.py +236 -240
  34. pyxllib/data/jsonlib.py +85 -89
  35. pyxllib/data/oss.py +72 -72
  36. pyxllib/data/pglib.py +1111 -1127
  37. pyxllib/data/sqlite.py +568 -568
  38. pyxllib/data/sqllib.py +297 -297
  39. pyxllib/ext/JLineViewer.py +505 -505
  40. pyxllib/ext/__init__.py +6 -6
  41. pyxllib/ext/demolib.py +251 -246
  42. pyxllib/ext/drissionlib.py +277 -277
  43. pyxllib/ext/kq5034lib.py +12 -12
  44. pyxllib/ext/qt.py +449 -449
  45. pyxllib/ext/robustprocfile.py +493 -497
  46. pyxllib/ext/seleniumlib.py +76 -76
  47. pyxllib/ext/tk.py +173 -173
  48. pyxllib/ext/unixlib.py +821 -827
  49. pyxllib/ext/utools.py +345 -351
  50. pyxllib/ext/webhook.py +124 -119
  51. pyxllib/ext/win32lib.py +40 -40
  52. pyxllib/ext/wjxlib.py +91 -88
  53. pyxllib/ext/wpsapi.py +124 -124
  54. pyxllib/ext/xlwork.py +9 -9
  55. pyxllib/ext/yuquelib.py +1110 -1105
  56. pyxllib/file/__init__.py +17 -17
  57. pyxllib/file/docxlib.py +757 -761
  58. pyxllib/file/gitlib.py +309 -309
  59. pyxllib/file/libreoffice.py +165 -165
  60. pyxllib/file/movielib.py +144 -148
  61. pyxllib/file/newbie.py +10 -10
  62. pyxllib/file/onenotelib.py +1469 -1469
  63. pyxllib/file/packlib/__init__.py +330 -330
  64. pyxllib/file/packlib/zipfile.py +2441 -2441
  65. pyxllib/file/pdflib.py +422 -426
  66. pyxllib/file/pupil.py +185 -185
  67. pyxllib/file/specialist/__init__.py +681 -685
  68. pyxllib/file/specialist/dirlib.py +799 -799
  69. pyxllib/file/specialist/download.py +193 -193
  70. pyxllib/file/specialist/filelib.py +2825 -2829
  71. pyxllib/file/xlsxlib.py +3122 -3131
  72. pyxllib/file/xlsyncfile.py +341 -341
  73. pyxllib/prog/__init__.py +5 -5
  74. pyxllib/prog/cachetools.py +58 -64
  75. pyxllib/prog/deprecatedlib.py +233 -233
  76. pyxllib/prog/filelock.py +42 -42
  77. pyxllib/prog/ipyexec.py +253 -253
  78. pyxllib/prog/multiprogs.py +940 -940
  79. pyxllib/prog/newbie.py +451 -451
  80. pyxllib/prog/pupil.py +1208 -1197
  81. pyxllib/prog/sitepackages.py +33 -33
  82. pyxllib/prog/specialist/__init__.py +348 -391
  83. pyxllib/prog/specialist/bc.py +203 -203
  84. pyxllib/prog/specialist/browser.py +497 -497
  85. pyxllib/prog/specialist/common.py +347 -347
  86. pyxllib/prog/specialist/datetime.py +198 -198
  87. pyxllib/prog/specialist/tictoc.py +240 -240
  88. pyxllib/prog/specialist/xllog.py +180 -180
  89. pyxllib/prog/xlosenv.py +110 -108
  90. pyxllib/stdlib/__init__.py +17 -17
  91. pyxllib/stdlib/tablepyxl/__init__.py +10 -10
  92. pyxllib/stdlib/tablepyxl/style.py +303 -303
  93. pyxllib/stdlib/tablepyxl/tablepyxl.py +130 -130
  94. pyxllib/text/__init__.py +8 -8
  95. pyxllib/text/ahocorasick.py +36 -39
  96. pyxllib/text/airscript.js +754 -744
  97. pyxllib/text/charclasslib.py +121 -121
  98. pyxllib/text/jiebalib.py +267 -267
  99. pyxllib/text/jinjalib.py +27 -32
  100. pyxllib/text/jsa_ai_prompt.md +271 -271
  101. pyxllib/text/jscode.py +922 -922
  102. pyxllib/text/latex/__init__.py +158 -158
  103. pyxllib/text/levenshtein.py +303 -303
  104. pyxllib/text/nestenv.py +1215 -1215
  105. pyxllib/text/newbie.py +300 -300
  106. pyxllib/text/pupil/__init__.py +8 -8
  107. pyxllib/text/pupil/common.py +1121 -1121
  108. pyxllib/text/pupil/xlalign.py +326 -326
  109. pyxllib/text/pycode.py +47 -47
  110. pyxllib/text/specialist/__init__.py +8 -8
  111. pyxllib/text/specialist/common.py +112 -112
  112. pyxllib/text/specialist/ptag.py +186 -186
  113. pyxllib/text/spellchecker.py +172 -172
  114. pyxllib/text/templates/echart_base.html +10 -10
  115. pyxllib/text/templates/highlight_code.html +16 -16
  116. pyxllib/text/templates/latex_editor.html +102 -102
  117. pyxllib/text/vbacode.py +17 -17
  118. pyxllib/text/xmllib.py +741 -747
  119. pyxllib/xl.py +42 -39
  120. pyxllib/xlcv.py +17 -17
  121. pyxllib-3.201.1.dist-info/METADATA +296 -0
  122. pyxllib-3.201.1.dist-info/RECORD +125 -0
  123. {pyxllib-0.3.197.dist-info → pyxllib-3.201.1.dist-info}/licenses/LICENSE +190 -190
  124. pyxllib/ext/old.py +0 -663
  125. pyxllib-0.3.197.dist-info/METADATA +0 -48
  126. pyxllib-0.3.197.dist-info/RECORD +0 -126
  127. {pyxllib-0.3.197.dist-info → pyxllib-3.201.1.dist-info}/WHEEL +0 -0
pyxllib/data/echarts.py CHANGED
@@ -1,240 +1,236 @@
1
- #!/usr/bin/env python3
2
- # -*- coding: utf-8 -*-
3
- # @Author : 陈坤泽
4
- # @Email : 877362867@qq.com
5
- # @Date : 2022/02/09 11:14
6
-
7
-
8
- """
9
- Apache ECharts: https://echarts.apache.org/zh/index.html
10
- python版:pyechats的封装
11
- """
12
-
13
- from pyxllib.prog.pupil import check_install_package
14
-
15
- check_install_package('pyecharts')
16
-
17
- # import types
18
-
19
- import pyecharts
20
- from pyecharts import options as opts
21
- from pyecharts.commons.utils import JsCode
22
- from pyecharts.globals import ChartType
23
- from pyecharts import types
24
- from pyecharts.charts import Bar, Line, Radar
25
- from pyecharts.charts.chart import Chart
26
-
27
- from pyxllib.prog.pupil import inject_members
28
- from pyxllib.prog.specialist import TicToc
29
- from pyxllib.file.specialist import XlPath
30
-
31
-
32
- class XlChart(Chart):
33
- def set_title(self, title):
34
- self.set_global_opts(title_opts=pyecharts.options.TitleOpts(title=title))
35
-
36
- def add_series(self, name, data, *, type=None, color=None, labels=None,
37
- **kwargs):
38
- """ 垃圾pyecharts,毁我青春~~
39
-
40
- 很多图x都不是等间距的,pyecharts处理不等间距x好像有很大的不兼容问题
41
- 需要手动添加x、y坐标位置
42
-
43
- :param list|tuple labels: 直接提供现成的文本标签
44
-
45
- """
46
- if type is None:
47
- type = self.__class__.__name__.lower()
48
-
49
- if labels:
50
- s = [[x[0][0], x[1]] for x in zip(data, labels)]
51
- fmt = JsCode(f"function(x){{var m = new Map({s}); return m.get(x.value[0]);}}")
52
- if 'label' not in kwargs:
53
- kwargs['label'] = opts.LabelOpts(is_show=True, formatter=fmt)
54
- elif isinstance(kwargs['label'], opts.LabelOpts):
55
- kwargs['label'].opts['formatter'] = fmt
56
- else:
57
- kwargs['label']['show'] = True
58
- kwargs['label']['formatter'] = fmt
59
-
60
- self._append_color(color)
61
- # self._append_legend(name, is_selected=True)
62
- self._append_legend(name)
63
-
64
- self.options.get('series').append(
65
- {
66
- 'type': type,
67
- 'name': name,
68
- 'data': data,
69
- **kwargs,
70
- }
71
- )
72
- return self
73
-
74
-
75
- inject_members(XlChart, Chart)
76
-
77
-
78
- class XlLine(Line):
79
- @classmethod
80
- def from_dict(cls, yaxis, xaxis=None, *, title=None,
81
- xaxis_name=None, yaxis_name=None, **kwargs):
82
- """ 查看一个数据的折线图
83
-
84
- :param list|dict yaxis: 列表数据,或者字典name: values表示的多组数据
85
- """
86
- c = cls()
87
-
88
- if isinstance(yaxis, (list, tuple)):
89
- yaxis = {'value': yaxis}
90
- if xaxis is None:
91
- xaxis = list(range(max([len(v) for v in yaxis.values()])))
92
- c.add_xaxis(xaxis)
93
- for k, v in yaxis.items():
94
- c.add_yaxis(k, v)
95
-
96
- configs = {
97
- 'tooltip_opts': opts.TooltipOpts(trigger="axis"),
98
- **kwargs,
99
- }
100
- c.set_global_opts(tooltip_opts=opts.TooltipOpts(trigger="axis"))
101
- if title:
102
- configs['title_opts'] = opts.TitleOpts(title=title)
103
- if xaxis_name:
104
- configs['xaxis_opts'] = opts.AxisOpts(name=xaxis_name, axislabel_opts=opts.LabelOpts(rotate=45, interval=0))
105
- if yaxis_name:
106
- configs['yaxis_opts'] = opts.AxisOpts(name=yaxis_name)
107
- c.set_global_opts(**configs)
108
- return c
109
-
110
-
111
- class XlBar(Bar):
112
-
113
- @classmethod
114
- def from_dict(cls, yaxis, xaxis=None, *, title=None,
115
- xaxis_name=None, yaxis_name=None, **kwargs):
116
- """ 查看一个数据的条形图
117
-
118
- :param list|dict yaxis: 列表数据,或者字典name: values表示的多组数据
119
- """
120
- c = cls()
121
-
122
- if isinstance(yaxis, (list, tuple)):
123
- yaxis = {'value': yaxis}
124
- if xaxis is None:
125
- xaxis = list(range(max([len(v) for v in yaxis.values()])))
126
- c.add_xaxis(xaxis)
127
- for k, v in yaxis.items():
128
- c.add_yaxis(k, v)
129
-
130
- configs = {
131
- 'tooltip_opts': opts.TooltipOpts(trigger="axis"),
132
- **kwargs,
133
- }
134
- c.set_global_opts(tooltip_opts=opts.TooltipOpts(trigger="axis"))
135
- if title:
136
- configs['title_opts'] = opts.TitleOpts(title=title)
137
- if xaxis_name:
138
- configs['xaxis_opts'] = opts.AxisOpts(name=xaxis_name)
139
- if yaxis_name:
140
- configs['yaxis_opts'] = opts.AxisOpts(name=yaxis_name)
141
- c.set_global_opts(**configs)
142
- return c
143
-
144
- @classmethod
145
- def from_list(cls, yaxis, xaxis=None, *, title=None):
146
- """
147
- >> browser(pyecharts.charts.Bar.from_list(numbers))
148
- """
149
- return cls.from_dict({'value': list(yaxis)}, xaxis=xaxis, title=title)
150
-
151
- @classmethod
152
- def from_data_split_into_groups(cls, data, groups, *, title=None):
153
- """根据给定的组数自动拆分数据并生成条形图
154
- :param list data: 数据清单
155
- :param int groups: 要拆分成的组数
156
- """
157
- # 找到最大值和最小值
158
- min_val, max_val = min(data), max(data)
159
-
160
- # 计算间隔
161
- interval = (max_val - min_val) / groups
162
-
163
- # 分组和标签
164
- group_counts = [0] * groups
165
- labels = []
166
- # todo 如果数据量特别大,这里应该排序后,再用特殊方法计算分组
167
- for value in data:
168
- index = min(int((value - min_val) / interval), groups - 1)
169
- group_counts[index] += 1
170
-
171
- for i in range(groups):
172
- labels.append(f"{min_val + interval * i:.2f}-{min_val + interval * (i + 1):.2f}")
173
- # t = cls.from_dict({'value': group_counts}, xaxis=labels, title=title)
174
-
175
- return cls.from_dict({'value': group_counts}, xaxis=labels, title=title)
176
-
177
-
178
- class XlRadar(Radar):
179
- """ 雷达图 """
180
-
181
- def __init__(self, *args, **kwargs):
182
- super().__init__(*args, **kwargs)
183
- self.color_idx = 0
184
-
185
- def add(
186
- self,
187
- series_name: str,
188
- data: types.Sequence[types.Union[opts.RadarItem, dict]],
189
- *,
190
- label_opts=None,
191
- color: types.Optional[str] = None,
192
- linestyle_opts=None,
193
- **kwargs
194
- ):
195
- """ 标准库(2.0.5版)的雷达图颜色渲染有问题,这里要增加一个修正过程 """
196
- if label_opts is None:
197
- label_opts = opts.LabelOpts(is_show=False)
198
-
199
- if linestyle_opts is None:
200
- linestyle_opts = opts.LineStyleOpts(color=self.colors[self.color_idx % len(self.colors)])
201
- self.color_idx += 1
202
- elif linestyle_opts.get('color') is None:
203
- linestyle_opts.update(color=self.colors[self.color_idx % len(self.colors)])
204
- self.color_idx += 1
205
-
206
- if color is None:
207
- color = linestyle_opts.get('color')
208
-
209
- return super(XlRadar, self).add(series_name, data,
210
- label_opts=label_opts,
211
- color=color,
212
- linestyle_opts=linestyle_opts,
213
- **kwargs)
214
-
215
-
216
- inject_members(XlBar, Bar)
217
-
218
-
219
- def render_echart_html(title='Awesome-pyecharts', body=''):
220
- from pyxllib.text.xmllib import get_jinja_template
221
- return get_jinja_template('echart_base.html').render(title=title, body=body)
222
-
223
-
224
- # 绘制帕累托累计图
225
- def draw_pareto_chart(data, accuracy=0.1, *, title='帕累托累积权重', value_unit_type='K'):
226
- from pyxllib.algo.stat import pareto_accumulate
227
- pts, labels = pareto_accumulate(data, accuracy=accuracy, value_unit_type=value_unit_type)
228
- x = Line()
229
- x.add_series(title, pts, labels=labels, label={'position': 'right'})
230
- x.set_global_opts(
231
- # x轴末尾要故意撑大一些,不然有部分内容会显示不全
232
- xaxis_opts=opts.AxisOpts(name='条目数', max_=int(float(f'{pts[-1][0] * 1.2:.2g}'))),
233
- yaxis_opts=opts.AxisOpts(name='累积和')
234
- )
235
- return x
236
-
237
-
238
- if __name__ == '__main__':
239
- with TicToc(__name__):
240
- pass
1
+ #!/usr/bin/env python3
2
+ # -*- coding: utf-8 -*-
3
+ # @Author : 陈坤泽
4
+ # @Email : 877362867@qq.com
5
+ # @Date : 2022/02/09 11:14
6
+
7
+
8
+ """
9
+ Apache ECharts: https://echarts.apache.org/zh/index.html
10
+ python版:pyechats的封装
11
+ """
12
+
13
+ # import types
14
+
15
+ import pyecharts
16
+ from pyecharts import options as opts
17
+ from pyecharts.commons.utils import JsCode
18
+ from pyecharts.globals import ChartType
19
+ from pyecharts import types
20
+ from pyecharts.charts import Bar, Line, Radar
21
+ from pyecharts.charts.chart import Chart
22
+
23
+ from pyxllib.prog.pupil import inject_members
24
+ from pyxllib.prog.specialist import TicToc
25
+ from pyxllib.file.specialist import XlPath
26
+
27
+
28
+ class XlChart(Chart):
29
+ def set_title(self, title):
30
+ self.set_global_opts(title_opts=pyecharts.options.TitleOpts(title=title))
31
+
32
+ def add_series(self, name, data, *, type=None, color=None, labels=None,
33
+ **kwargs):
34
+ """ 垃圾pyecharts,毁我青春~~
35
+
36
+ 很多图x都不是等间距的,pyecharts处理不等间距x好像有很大的不兼容问题
37
+ 需要手动添加x、y坐标位置
38
+
39
+ :param list|tuple labels: 直接提供现成的文本标签
40
+
41
+ """
42
+ if type is None:
43
+ type = self.__class__.__name__.lower()
44
+
45
+ if labels:
46
+ s = [[x[0][0], x[1]] for x in zip(data, labels)]
47
+ fmt = JsCode(f"function(x){{var m = new Map({s}); return m.get(x.value[0]);}}")
48
+ if 'label' not in kwargs:
49
+ kwargs['label'] = opts.LabelOpts(is_show=True, formatter=fmt)
50
+ elif isinstance(kwargs['label'], opts.LabelOpts):
51
+ kwargs['label'].opts['formatter'] = fmt
52
+ else:
53
+ kwargs['label']['show'] = True
54
+ kwargs['label']['formatter'] = fmt
55
+
56
+ self._append_color(color)
57
+ # self._append_legend(name, is_selected=True)
58
+ self._append_legend(name)
59
+
60
+ self.options.get('series').append(
61
+ {
62
+ 'type': type,
63
+ 'name': name,
64
+ 'data': data,
65
+ **kwargs,
66
+ }
67
+ )
68
+ return self
69
+
70
+
71
+ inject_members(XlChart, Chart)
72
+
73
+
74
+ class XlLine(Line):
75
+ @classmethod
76
+ def from_dict(cls, yaxis, xaxis=None, *, title=None,
77
+ xaxis_name=None, yaxis_name=None, **kwargs):
78
+ """ 查看一个数据的折线图
79
+
80
+ :param list|dict yaxis: 列表数据,或者字典name: values表示的多组数据
81
+ """
82
+ c = cls()
83
+
84
+ if isinstance(yaxis, (list, tuple)):
85
+ yaxis = {'value': yaxis}
86
+ if xaxis is None:
87
+ xaxis = list(range(max([len(v) for v in yaxis.values()])))
88
+ c.add_xaxis(xaxis)
89
+ for k, v in yaxis.items():
90
+ c.add_yaxis(k, v)
91
+
92
+ configs = {
93
+ 'tooltip_opts': opts.TooltipOpts(trigger="axis"),
94
+ **kwargs,
95
+ }
96
+ c.set_global_opts(tooltip_opts=opts.TooltipOpts(trigger="axis"))
97
+ if title:
98
+ configs['title_opts'] = opts.TitleOpts(title=title)
99
+ if xaxis_name:
100
+ configs['xaxis_opts'] = opts.AxisOpts(name=xaxis_name, axislabel_opts=opts.LabelOpts(rotate=45, interval=0))
101
+ if yaxis_name:
102
+ configs['yaxis_opts'] = opts.AxisOpts(name=yaxis_name)
103
+ c.set_global_opts(**configs)
104
+ return c
105
+
106
+
107
+ class XlBar(Bar):
108
+
109
+ @classmethod
110
+ def from_dict(cls, yaxis, xaxis=None, *, title=None,
111
+ xaxis_name=None, yaxis_name=None, **kwargs):
112
+ """ 查看一个数据的条形图
113
+
114
+ :param list|dict yaxis: 列表数据,或者字典name: values表示的多组数据
115
+ """
116
+ c = cls()
117
+
118
+ if isinstance(yaxis, (list, tuple)):
119
+ yaxis = {'value': yaxis}
120
+ if xaxis is None:
121
+ xaxis = list(range(max([len(v) for v in yaxis.values()])))
122
+ c.add_xaxis(xaxis)
123
+ for k, v in yaxis.items():
124
+ c.add_yaxis(k, v)
125
+
126
+ configs = {
127
+ 'tooltip_opts': opts.TooltipOpts(trigger="axis"),
128
+ **kwargs,
129
+ }
130
+ c.set_global_opts(tooltip_opts=opts.TooltipOpts(trigger="axis"))
131
+ if title:
132
+ configs['title_opts'] = opts.TitleOpts(title=title)
133
+ if xaxis_name:
134
+ configs['xaxis_opts'] = opts.AxisOpts(name=xaxis_name)
135
+ if yaxis_name:
136
+ configs['yaxis_opts'] = opts.AxisOpts(name=yaxis_name)
137
+ c.set_global_opts(**configs)
138
+ return c
139
+
140
+ @classmethod
141
+ def from_list(cls, yaxis, xaxis=None, *, title=None):
142
+ """
143
+ >> browser(pyecharts.charts.Bar.from_list(numbers))
144
+ """
145
+ return cls.from_dict({'value': list(yaxis)}, xaxis=xaxis, title=title)
146
+
147
+ @classmethod
148
+ def from_data_split_into_groups(cls, data, groups, *, title=None):
149
+ """根据给定的组数自动拆分数据并生成条形图
150
+ :param list data: 数据清单
151
+ :param int groups: 要拆分成的组数
152
+ """
153
+ # 找到最大值和最小值
154
+ min_val, max_val = min(data), max(data)
155
+
156
+ # 计算间隔
157
+ interval = (max_val - min_val) / groups
158
+
159
+ # 分组和标签
160
+ group_counts = [0] * groups
161
+ labels = []
162
+ # todo 如果数据量特别大,这里应该排序后,再用特殊方法计算分组
163
+ for value in data:
164
+ index = min(int((value - min_val) / interval), groups - 1)
165
+ group_counts[index] += 1
166
+
167
+ for i in range(groups):
168
+ labels.append(f"{min_val + interval * i:.2f}-{min_val + interval * (i + 1):.2f}")
169
+ # t = cls.from_dict({'value': group_counts}, xaxis=labels, title=title)
170
+
171
+ return cls.from_dict({'value': group_counts}, xaxis=labels, title=title)
172
+
173
+
174
+ class XlRadar(Radar):
175
+ """ 雷达图 """
176
+
177
+ def __init__(self, *args, **kwargs):
178
+ super().__init__(*args, **kwargs)
179
+ self.color_idx = 0
180
+
181
+ def add(
182
+ self,
183
+ series_name: str,
184
+ data: types.Sequence[types.Union[opts.RadarItem, dict]],
185
+ *,
186
+ label_opts=None,
187
+ color: types.Optional[str] = None,
188
+ linestyle_opts=None,
189
+ **kwargs
190
+ ):
191
+ """ 标准库(2.0.5版)的雷达图颜色渲染有问题,这里要增加一个修正过程 """
192
+ if label_opts is None:
193
+ label_opts = opts.LabelOpts(is_show=False)
194
+
195
+ if linestyle_opts is None:
196
+ linestyle_opts = opts.LineStyleOpts(color=self.colors[self.color_idx % len(self.colors)])
197
+ self.color_idx += 1
198
+ elif linestyle_opts.get('color') is None:
199
+ linestyle_opts.update(color=self.colors[self.color_idx % len(self.colors)])
200
+ self.color_idx += 1
201
+
202
+ if color is None:
203
+ color = linestyle_opts.get('color')
204
+
205
+ return super(XlRadar, self).add(series_name, data,
206
+ label_opts=label_opts,
207
+ color=color,
208
+ linestyle_opts=linestyle_opts,
209
+ **kwargs)
210
+
211
+
212
+ inject_members(XlBar, Bar)
213
+
214
+
215
+ def render_echart_html(title='Awesome-pyecharts', body=''):
216
+ from pyxllib.text.xmllib import get_jinja_template
217
+ return get_jinja_template('echart_base.html').render(title=title, body=body)
218
+
219
+
220
+ # 绘制帕累托累计图
221
+ def draw_pareto_chart(data, accuracy=0.1, *, title='帕累托累积权重', value_unit_type='K'):
222
+ from pyxllib.algo.stat import pareto_accumulate
223
+ pts, labels = pareto_accumulate(data, accuracy=accuracy, value_unit_type=value_unit_type)
224
+ x = Line()
225
+ x.add_series(title, pts, labels=labels, label={'position': 'right'})
226
+ x.set_global_opts(
227
+ # x轴末尾要故意撑大一些,不然有部分内容会显示不全
228
+ xaxis_opts=opts.AxisOpts(name='条目数', max_=int(float(f'{pts[-1][0] * 1.2:.2g}'))),
229
+ yaxis_opts=opts.AxisOpts(name='累积和')
230
+ )
231
+ return x
232
+
233
+
234
+ if __name__ == '__main__':
235
+ with TicToc(__name__):
236
+ pass