modusa 0.3.56__tar.gz → 0.3.58__tar.gz

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 (93) hide show
  1. {modusa-0.3.56 → modusa-0.3.58}/PKG-INFO +1 -1
  2. {modusa-0.3.56 → modusa-0.3.58}/pyproject.toml +1 -1
  3. {modusa-0.3.56 → modusa-0.3.58}/src/modusa/tools/plotter.py +32 -8
  4. {modusa-0.3.56 → modusa-0.3.58}/LICENSE.md +0 -0
  5. {modusa-0.3.56 → modusa-0.3.58}/README.md +0 -0
  6. {modusa-0.3.56 → modusa-0.3.58}/src/modusa/.DS_Store +0 -0
  7. {modusa-0.3.56 → modusa-0.3.58}/src/modusa/__init__.py +0 -0
  8. {modusa-0.3.56 → modusa-0.3.58}/src/modusa/config.py +0 -0
  9. {modusa-0.3.56 → modusa-0.3.58}/src/modusa/decorators.py +0 -0
  10. {modusa-0.3.56 → modusa-0.3.58}/src/modusa/devtools/generate_docs_source.py +0 -0
  11. {modusa-0.3.56 → modusa-0.3.58}/src/modusa/devtools/generate_template.py +0 -0
  12. {modusa-0.3.56 → modusa-0.3.58}/src/modusa/devtools/list_authors.py +0 -0
  13. {modusa-0.3.56 → modusa-0.3.58}/src/modusa/devtools/list_plugins.py +0 -0
  14. {modusa-0.3.56 → modusa-0.3.58}/src/modusa/devtools/main.py +0 -0
  15. {modusa-0.3.56 → modusa-0.3.58}/src/modusa/devtools/templates/generator.py +0 -0
  16. {modusa-0.3.56 → modusa-0.3.58}/src/modusa/devtools/templates/io.py +0 -0
  17. {modusa-0.3.56 → modusa-0.3.58}/src/modusa/devtools/templates/model.py +0 -0
  18. {modusa-0.3.56 → modusa-0.3.58}/src/modusa/devtools/templates/plugin.py +0 -0
  19. {modusa-0.3.56 → modusa-0.3.58}/src/modusa/devtools/templates/test.py +0 -0
  20. {modusa-0.3.56 → modusa-0.3.58}/src/modusa/devtools/templates/tool.py +0 -0
  21. {modusa-0.3.56 → modusa-0.3.58}/src/modusa/fonts/NotoSansDevanagari-Regular.ttf +0 -0
  22. {modusa-0.3.56 → modusa-0.3.58}/src/modusa/generators/__init__.py +0 -0
  23. {modusa-0.3.56 → modusa-0.3.58}/src/modusa/generators/audio.py +0 -0
  24. {modusa-0.3.56 → modusa-0.3.58}/src/modusa/generators/audio_waveforms.py +0 -0
  25. {modusa-0.3.56 → modusa-0.3.58}/src/modusa/generators/base.py +0 -0
  26. {modusa-0.3.56 → modusa-0.3.58}/src/modusa/generators/ftds.py +0 -0
  27. {modusa-0.3.56 → modusa-0.3.58}/src/modusa/generators/s1d.py +0 -0
  28. {modusa-0.3.56 → modusa-0.3.58}/src/modusa/generators/s2d.py +0 -0
  29. {modusa-0.3.56 → modusa-0.3.58}/src/modusa/generators/s_ax.py +0 -0
  30. {modusa-0.3.56 → modusa-0.3.58}/src/modusa/generators/t_ax.py +0 -0
  31. {modusa-0.3.56 → modusa-0.3.58}/src/modusa/generators/tds.py +0 -0
  32. {modusa-0.3.56 → modusa-0.3.58}/src/modusa/models/__init__.py +0 -0
  33. {modusa-0.3.56 → modusa-0.3.58}/src/modusa/models/__pycache__/signal1D.cpython-312.pyc.4443461152 +0 -0
  34. {modusa-0.3.56 → modusa-0.3.58}/src/modusa/models/audio.py +0 -0
  35. {modusa-0.3.56 → modusa-0.3.58}/src/modusa/models/base.py +0 -0
  36. {modusa-0.3.56 → modusa-0.3.58}/src/modusa/models/data.py +0 -0
  37. {modusa-0.3.56 → modusa-0.3.58}/src/modusa/models/ftds.py +0 -0
  38. {modusa-0.3.56 → modusa-0.3.58}/src/modusa/models/s1d.py +0 -0
  39. {modusa-0.3.56 → modusa-0.3.58}/src/modusa/models/s2d.py +0 -0
  40. {modusa-0.3.56 → modusa-0.3.58}/src/modusa/models/s_ax.py +0 -0
  41. {modusa-0.3.56 → modusa-0.3.58}/src/modusa/models/t_ax.py +0 -0
  42. {modusa-0.3.56 → modusa-0.3.58}/src/modusa/models/tds.py +0 -0
  43. {modusa-0.3.56 → modusa-0.3.58}/src/modusa/plugins/__init__.py +0 -0
  44. {modusa-0.3.56 → modusa-0.3.58}/src/modusa/plugins/base.py +0 -0
  45. {modusa-0.3.56 → modusa-0.3.58}/src/modusa/tools/__init__.py +0 -0
  46. {modusa-0.3.56 → modusa-0.3.58}/src/modusa/tools/_plotter_old.py +0 -0
  47. {modusa-0.3.56 → modusa-0.3.58}/src/modusa/tools/ann_loader.py +0 -0
  48. {modusa-0.3.56 → modusa-0.3.58}/src/modusa/tools/audio_converter.py +0 -0
  49. {modusa-0.3.56 → modusa-0.3.58}/src/modusa/tools/audio_loader.py +0 -0
  50. {modusa-0.3.56 → modusa-0.3.58}/src/modusa/tools/audio_player.py +0 -0
  51. {modusa-0.3.56 → modusa-0.3.58}/src/modusa/tools/audio_recorder.py +0 -0
  52. {modusa-0.3.56 → modusa-0.3.58}/src/modusa/tools/base.py +0 -0
  53. {modusa-0.3.56 → modusa-0.3.58}/src/modusa/tools/math_ops.py +0 -0
  54. {modusa-0.3.56 → modusa-0.3.58}/src/modusa/tools/youtube_downloader.py +0 -0
  55. {modusa-0.3.56 → modusa-0.3.58}/src/modusa/utils/.DS_Store +0 -0
  56. {modusa-0.3.56 → modusa-0.3.58}/src/modusa/utils/__init__.py +0 -0
  57. {modusa-0.3.56 → modusa-0.3.58}/src/modusa/utils/config.py +0 -0
  58. {modusa-0.3.56 → modusa-0.3.58}/src/modusa/utils/excp.py +0 -0
  59. {modusa-0.3.56 → modusa-0.3.58}/src/modusa/utils/logger.py +0 -0
  60. {modusa-0.3.56 → modusa-0.3.58}/src/modusa/utils/np_func_cat.py +0 -0
  61. {modusa-0.3.56 → modusa-0.3.58}/src/modusa/utils/plot.py +0 -0
  62. {modusa-0.3.56 → modusa-0.3.58}/tests/__init__.py +0 -0
  63. {modusa-0.3.56 → modusa-0.3.58}/tests/data/song1.mp3 +0 -0
  64. {modusa-0.3.56 → modusa-0.3.58}/tests/data/song1.wav +0 -0
  65. {modusa-0.3.56 → modusa-0.3.58}/tests/test_generators/audio_waveform.py +0 -0
  66. {modusa-0.3.56 → modusa-0.3.58}/tests/test_generators/test_audio.py +0 -0
  67. {modusa-0.3.56 → modusa-0.3.58}/tests/test_generators/test_ftds.py +0 -0
  68. {modusa-0.3.56 → modusa-0.3.58}/tests/test_generators/test_s1d.py +0 -0
  69. {modusa-0.3.56 → modusa-0.3.58}/tests/test_generators/test_s2d.py +0 -0
  70. {modusa-0.3.56 → modusa-0.3.58}/tests/test_generators/test_s_ax.py +0 -0
  71. {modusa-0.3.56 → modusa-0.3.58}/tests/test_generators/test_signal.py +0 -0
  72. {modusa-0.3.56 → modusa-0.3.58}/tests/test_generators/test_signal_generator.py +0 -0
  73. {modusa-0.3.56 → modusa-0.3.58}/tests/test_generators/test_t_ax.py +0 -0
  74. {modusa-0.3.56 → modusa-0.3.58}/tests/test_generators/test_tds.py +0 -0
  75. {modusa-0.3.56 → modusa-0.3.58}/tests/test_io/audio_player.py +0 -0
  76. {modusa-0.3.56 → modusa-0.3.58}/tests/test_io/plotter.py +0 -0
  77. {modusa-0.3.56 → modusa-0.3.58}/tests/test_models/test_data.py +0 -0
  78. {modusa-0.3.56 → modusa-0.3.58}/tests/test_models/test_t_ax.py +0 -0
  79. {modusa-0.3.56 → modusa-0.3.58}/tests/test_plugins/youtube_audio_loader.py +0 -0
  80. {modusa-0.3.56 → modusa-0.3.58}/tests/test_signals/frequency_domain_signal.py +0 -0
  81. {modusa-0.3.56 → modusa-0.3.58}/tests/test_signals/spectrogram.py +0 -0
  82. {modusa-0.3.56 → modusa-0.3.58}/tests/test_signals/test_axis.py +0 -0
  83. {modusa-0.3.56 → modusa-0.3.58}/tests/test_signals/test_feature_time_domain_signal.py +0 -0
  84. {modusa-0.3.56 → modusa-0.3.58}/tests/test_signals/test_frequency_time_domain_signal.py +0 -0
  85. {modusa-0.3.56 → modusa-0.3.58}/tests/test_signals/test_signal1D.py +0 -0
  86. {modusa-0.3.56 → modusa-0.3.58}/tests/test_signals/test_signal2D.py +0 -0
  87. {modusa-0.3.56 → modusa-0.3.58}/tests/test_signals/test_time_domain_signal.py +0 -0
  88. {modusa-0.3.56 → modusa-0.3.58}/tests/test_signals/test_u_ax.py +0 -0
  89. {modusa-0.3.56 → modusa-0.3.58}/tests/test_signals/test_window_signal.py +0 -0
  90. {modusa-0.3.56 → modusa-0.3.58}/tests/test_signals/time_domain_signal.py +0 -0
  91. {modusa-0.3.56 → modusa-0.3.58}/tests/test_tools/test_audio_converter.py +0 -0
  92. {modusa-0.3.56 → modusa-0.3.58}/tests/test_tools/test_fourier_tranform.py +0 -0
  93. {modusa-0.3.56 → modusa-0.3.58}/tests/test_tools/test_math_ops.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: modusa
3
- Version: 0.3.56
3
+ Version: 0.3.58
4
4
  Summary: A modular signal analysis python library.
5
5
  Author-Email: Ankit Anand <ankit0.anand0@gmail.com>
6
6
  License: MIT
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "modusa"
3
- version = "0.3.56"
3
+ version = "0.3.58"
4
4
  description = "A modular signal analysis python library."
5
5
  authors = [
6
6
  { name = "Ankit Anand", email = "ankit0.anand0@gmail.com" },
@@ -12,8 +12,8 @@ import matplotlib.font_manager as fm
12
12
  import matplotlib.pyplot as plt
13
13
  import matplotlib.gridspec as gridspec
14
14
  from matplotlib.patches import Rectangle
15
-
16
15
  import numpy as np
16
+ import fnmatch
17
17
 
18
18
  #===== Loading Devanagari font ========
19
19
  def _load_devanagari_font():
@@ -259,7 +259,6 @@ class Fig:
259
259
  curr_row = self._get_curr_row() if ax is None else self._axs[ax]
260
260
 
261
261
  extent = self._calculate_extent(x, y, o)
262
- print(extent)
263
262
 
264
263
  im = curr_row[0].imshow(M, aspect="auto", origin=o, cmap=c, extent=extent)
265
264
 
@@ -326,7 +325,7 @@ class Fig:
326
325
  else:
327
326
  curr_row[0].axvline(x=event, color=c, linestyle=ls, linewidth=lw)
328
327
 
329
- def add_annotation(self, ann, label=None, ax=None):
328
+ def add_annotation(self, ann, label=None, patterns=None, ax=None):
330
329
  """
331
330
  Add annotation to the figure.
332
331
 
@@ -339,6 +338,10 @@ class Fig:
339
338
  - Label for the annotation type.
340
339
  - This will appear to the right of the aux plot.
341
340
  - Default: None
341
+ patterns: list[str]
342
+ - Patterns to group annotations
343
+ - E.g., "*R" or "<tag>*" or ["A*", "*B"]
344
+ - All elements in a group will have same color.
342
345
  ax: int
343
346
  - Which specific axis to plot (1, 2, 3, ...)
344
347
  - None
@@ -350,7 +353,24 @@ class Fig:
350
353
 
351
354
  xlim = self._xlim
352
355
 
353
- for i, (start, end, tag) in enumerate(ann):
356
+ if isinstance(patterns, str): patterns = [patterns]
357
+
358
+ if patterns is not None:
359
+ for i, (start, end, tag) in enumerate(ann):
360
+ for j, pattern in enumerate(patterns):
361
+ if fnmatch.fnmatch(tag, pattern):
362
+ ann[i] = (start, end, tag, j)
363
+ break
364
+ else:
365
+ ann[i] = (start, end, tag, None)
366
+ else:
367
+ for i, (start, end, tag) in enumerate(ann):
368
+ ann[i] = (start, end, tag, None)
369
+
370
+ colors = plt.rcParams['axes.prop_cycle'].by_key()['color']
371
+ print(ann)
372
+
373
+ for i, (start, end, tag, group) in enumerate(ann):
354
374
  # We make sure that we only plot annotation that are within the x range of the current view
355
375
  if xlim is not None:
356
376
  if start >= xlim[1] or end <= xlim[0]:
@@ -360,8 +380,10 @@ class Fig:
360
380
  start = max(start, xlim[0])
361
381
  end = min(end, xlim[1])
362
382
 
363
- box_colors = ["gray", "lightgray"] # Alternates color between two
364
- box_color = box_colors[i % 2]
383
+ if group is not None:
384
+ box_color = colors[group]
385
+ else:
386
+ box_color = "lightgray"
365
387
 
366
388
  width = end - start
367
389
  rect = Rectangle((start, 0), width, 1, facecolor=box_color, edgecolor="black", alpha=0.7)
@@ -375,8 +397,10 @@ class Fig:
375
397
 
376
398
  text_obj.set_clip_path(rect)
377
399
  else:
378
- box_colors = ["gray", "lightgray"] # Alternates color between two
379
- box_color = box_colors[i % 2]
400
+ if group is not None:
401
+ box_color = colors[group]
402
+ else:
403
+ box_color = "lightgray"
380
404
 
381
405
  width = end - start
382
406
  rect = Rectangle((start, 0), width, 1, facecolor=box_color, edgecolor="black", alpha=0.7)
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes