oafuncs 0.0.98.37__py3-none-any.whl → 0.0.98.39__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.
@@ -155,7 +155,8 @@ class ParallelExecutor:
155
155
  # 实时更新进度条
156
156
  progress_bar.update(1)
157
157
  progress_bar.refresh()
158
- print('\n') # 结束进度条输出
158
+ # 完成后换行
159
+ print()
159
160
  return results
160
161
 
161
162
  def _chunked_execution(self, func: Callable, params: List[Tuple], chunk_size: int) -> List[Any]:
@@ -190,7 +191,8 @@ class ParallelExecutor:
190
191
  # 更新分块进度
191
192
  progress_bar.update(1)
192
193
  progress_bar.refresh()
193
- print('\n')
194
+ # 完成后换行
195
+ print()
194
196
  return results
195
197
 
196
198
  @staticmethod
oafuncs/oa_cmap.py CHANGED
@@ -313,6 +313,7 @@ def random_color():
313
313
  b = random.randint(0, 255)
314
314
  return f"#{r:02x}{g:02x}{b:02x}"
315
315
 
316
+
316
317
  if __name__ == "__main__":
317
318
  # ** 测试自制cmap
318
319
  colors = ["#C2B7F3", "#B3BBF2", "#B0CBF1", "#ACDCF0", "#A8EEED"]
oafuncs/oa_draw.py CHANGED
@@ -6,7 +6,7 @@ import matplotlib.pyplot as plt
6
6
  import numpy as np
7
7
  from rich import print
8
8
 
9
- __all__ = ["fig_minus", "gif", "movie", "setup_map", "MidpointNormalize"]
9
+ __all__ = ["fig_minus", "gif", "movie", "setup_map", "ticks_symmetric"]
10
10
 
11
11
  warnings.filterwarnings("ignore")
12
12
 
@@ -314,57 +314,47 @@ def setup_map(
314
314
  return axes
315
315
 
316
316
 
317
- class MidpointNormalize(mpl.colors.Normalize):
318
- """Custom normalization class to center a specific value.
319
-
320
- Args:
321
- vmin (float, optional): Minimum data value. Defaults to None.
322
- vmax (float, optional): Maximum data value. Defaults to None.
323
- vcenter (float, optional): Center value for normalization. Defaults to 0.
324
- clip (bool, optional): Whether to clip data outside the range. Defaults to False.
325
-
326
- Example:
327
- >>> norm = MidpointNormalize(vmin=-2, vmax=1, vcenter=0)
317
+ def ticks_symmetric(vmin: float, vcenter: float, vmax: float, num: int = 7) -> np.ndarray:
328
318
  """
329
-
330
- def __init__(self, vmin: float = None, vmax: float = None, vcenter: float = 0, clip: bool = False) -> None:
331
- self.vcenter = vcenter
332
- super().__init__(vmin, vmax, clip)
333
-
334
- def __call__(self, value: np.ndarray, clip: bool = None) -> np.ma.MaskedArray:
335
- # Use the clip parameter from initialization if not provided
336
- if clip is None:
337
- clip = self.clip
338
-
339
- x, y = [self.vmin, self.vcenter, self.vmax], [0, 0.5, 1.0]
340
- result = np.interp(value, x, y)
341
-
342
- # Apply clipping if requested
343
- if clip:
344
- result = np.clip(result, 0, 1)
345
-
346
- return np.ma.masked_array(result)
319
+ 生成以指定中心点对称分布的刻度值
347
320
 
348
- def ticks(self, num_ticks: int = 7) -> np.ndarray:
349
- """Generate ticks for the normalization range, centered around vcenter."""
350
- if self.vmin is None or self.vmax is None:
351
- raise ValueError("vmin and vmax must be set to generate ticks.")
352
-
353
- if num_ticks % 2 == 0:
354
- num_ticks += 1
355
-
356
- num_points_side = (num_ticks - 1) // 2 + 1
357
-
358
- negative_ticks = np.linspace(self.vmin, self.vcenter, num_points_side)[:-1]
359
- positive_ticks = np.linspace(self.vcenter, self.vmax, num_points_side)[1:]
360
-
361
- ticks = np.concatenate([negative_ticks, [self.vcenter], positive_ticks])
362
-
363
- return ticks
364
-
365
- def inverse(self, value: np.ndarray) -> np.ndarray:
366
- y, x = [self.vmin, self.vcenter, self.vmax], [0, 0.5, 1]
367
- return np.interp(value, x, y)
321
+ 参数:
322
+ vmin (float): 最小值
323
+ vcenter (float): 中心值
324
+ vmax (float): 最大值
325
+ num (int, optional): 期望的刻度数量(必须是奇数)。默认为7
326
+
327
+ 返回:
328
+ np.ndarray: 对称分布的刻度值数组
329
+
330
+ 异常:
331
+ ValueError: 如果输入值无效
332
+
333
+ 示例:
334
+ >>> ticks_symmetric(vmin=-10, vcenter=0, vmax=10, num=5)
335
+ array([-10., -5., 0., 5., 10.])
336
+ """
337
+ # 验证输入参数
338
+ if vmin >= vcenter:
339
+ raise ValueError(f"vmin ({vmin}) must be less than vcenter ({vcenter})")
340
+ if vcenter >= vmax:
341
+ raise ValueError(f"vcenter ({vcenter}) must be less than vmax ({vmax})")
342
+
343
+ # 确保刻度数量是奇数
344
+ if num % 2 == 0:
345
+ num += 1
346
+
347
+ # 计算每侧的点数(包括中心点)
348
+ side_points = (num - 1) // 2 + 1
349
+
350
+ # 生成左侧刻度(从最小值到中心值)
351
+ left_ticks = np.linspace(vmin, vcenter, side_points)[:-1]
352
+
353
+ # 生成右侧刻度(从中心值到最大值)
354
+ right_ticks = np.linspace(vcenter, vmax, side_points)[1:]
355
+
356
+ # 组合所有刻度
357
+ return np.concatenate([left_ticks, [vcenter], right_ticks])
368
358
 
369
359
 
370
360
  if __name__ == "__main__":
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: oafuncs
3
- Version: 0.0.98.37
3
+ Version: 0.0.98.39
4
4
  Summary: Oceanic and Atmospheric Functions
5
5
  Home-page: https://github.com/Industry-Pays/OAFuncs
6
6
  Author: Kun Liu
@@ -1,8 +1,8 @@
1
1
  oafuncs/__init__.py,sha256=T_-VtnWWllV3Q91twT5Yt2sUapeA051QbPNnBxmg9nw,1456
2
- oafuncs/oa_cmap.py,sha256=h9QrOSwbzZJXuS2pjFZkJtck1bq9itPY1natIuIRB3s,13884
2
+ oafuncs/oa_cmap.py,sha256=JwZMJ36uNwiCnzXqEtH2_PpeLtEaRaXP9YeGSl0PJSU,13886
3
3
  oafuncs/oa_data.py,sha256=u4H1ZazQf2jmGx3IAiaGxLjQHY9cQEMizRIaTQW4UiE,8075
4
4
  oafuncs/oa_date.py,sha256=aU2wVIWXyWoRiSQ9dg8sHvShFTxw86RrgbV3Q6tDjD4,6841
5
- oafuncs/oa_draw.py,sha256=UnUyOcr6KHtEWCZG0TCnHFW0jrjkAW9XWZoUDcSs6oI,14386
5
+ oafuncs/oa_draw.py,sha256=zxwxmTsS6-s6YFvrVJTr06_O39y0ykVxtOrShgDM4Qg,13754
6
6
  oafuncs/oa_file.py,sha256=fLb0gRhq2AiPl-5ASDHMrx6Z267FmhqNcTV7CdCxTdI,16934
7
7
  oafuncs/oa_help.py,sha256=0J5VaZX-cB0c090KxgmktQJBc0o00FsY-4wB8l5y00k,4178
8
8
  oafuncs/oa_nc.py,sha256=mKNxQ9jPxfRH7xINyrX7tBhitG5gmOKm6Dn7stk5mdw,15279
@@ -16,7 +16,7 @@ oafuncs/_script/email.py,sha256=l5xDgdVj8O5V0J2SwjsHKdUuxOH2jZvwdMO_P0dImHU,2684
16
16
  oafuncs/_script/netcdf_merge.py,sha256=tM9ePqLiEsE7eIsNM5XjEYeXwxjYOdNz5ejnEuI7xKw,6066
17
17
  oafuncs/_script/netcdf_modify.py,sha256=XDlAEToe_lwfAetkBSENqU5df-wnH7MGuxNTjG1gwHY,4178
18
18
  oafuncs/_script/netcdf_write.py,sha256=GvyUyUhzMonzSp3y4pT8ZAfbQrsh5J3dLnmINYJKhuE,21422
19
- oafuncs/_script/parallel.py,sha256=glEeZEg6HU3q1E6kUF-9k4l__KmIa3KlOglbOUcqubU,10047
19
+ oafuncs/_script/parallel.py,sha256=VMNhK3PNcZrIj-ZxcmAWuU3mIfVsfztsk2Ceqwri4e4,10069
20
20
  oafuncs/_script/parallel_bak.py,sha256=2ySmYZ9e_PLhhMocWCCFWCYZD3Gs_mxl0HxEzbIuQvA,8861
21
21
  oafuncs/_script/plot_dataset.py,sha256=QrA4vOCzWbAJp3hf5YYzgIRUZdJB5_ugepgyT_YfnaY,16327
22
22
  oafuncs/_script/replace_file_content.py,sha256=wIwvaISFNYWG58BLZHZP9ZgbC5OhoZ-cpR3y25U1EUM,5601
@@ -37,8 +37,8 @@ oafuncs/oa_sign/__init__.py,sha256=JSx1fcWpmNhQBvX_Bmq3xysfSkkFMrjbJASxV_V6aqE,1
37
37
  oafuncs/oa_sign/meteorological.py,sha256=3MSjy7HTcvz2zsITkjUMr_0Y027Gas1LFE9pk99990k,6110
38
38
  oafuncs/oa_sign/ocean.py,sha256=3uYEzaq-27yVy23IQoqy-clhWu1I_fhPFBAQyT-OF4M,5562
39
39
  oafuncs/oa_sign/scientific.py,sha256=moIl2MEY4uitbXoD596JmXookXGQtQsS-8_1NBBTx84,4689
40
- oafuncs-0.0.98.37.dist-info/licenses/LICENSE.txt,sha256=rMtLpVg8sKiSlwClfR9w_Dd_5WubTQgoOzE2PDFxzs4,1074
41
- oafuncs-0.0.98.37.dist-info/METADATA,sha256=EuBjhFOpWRAcZeADmTIFmg5FUSholH23O3qn5CsCR5U,4326
42
- oafuncs-0.0.98.37.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
43
- oafuncs-0.0.98.37.dist-info/top_level.txt,sha256=bgC35QkXbN4EmPHEveg_xGIZ5i9NNPYWqtJqaKqTPsQ,8
44
- oafuncs-0.0.98.37.dist-info/RECORD,,
40
+ oafuncs-0.0.98.39.dist-info/licenses/LICENSE.txt,sha256=rMtLpVg8sKiSlwClfR9w_Dd_5WubTQgoOzE2PDFxzs4,1074
41
+ oafuncs-0.0.98.39.dist-info/METADATA,sha256=2hppaUc6XZv609HGI_ZRS8GRPARn1Q9MI8xgb4JBfhs,4326
42
+ oafuncs-0.0.98.39.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
43
+ oafuncs-0.0.98.39.dist-info/top_level.txt,sha256=bgC35QkXbN4EmPHEveg_xGIZ5i9NNPYWqtJqaKqTPsQ,8
44
+ oafuncs-0.0.98.39.dist-info/RECORD,,