modusa 0.3.48__tar.gz → 0.3.51__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.48 → modusa-0.3.51}/PKG-INFO +1 -1
  2. {modusa-0.3.48 → modusa-0.3.51}/pyproject.toml +1 -1
  3. {modusa-0.3.48 → modusa-0.3.51}/src/modusa/tools/plotter.py +56 -12
  4. {modusa-0.3.48 → modusa-0.3.51}/LICENSE.md +0 -0
  5. {modusa-0.3.48 → modusa-0.3.51}/README.md +0 -0
  6. {modusa-0.3.48 → modusa-0.3.51}/src/modusa/.DS_Store +0 -0
  7. {modusa-0.3.48 → modusa-0.3.51}/src/modusa/__init__.py +0 -0
  8. {modusa-0.3.48 → modusa-0.3.51}/src/modusa/config.py +0 -0
  9. {modusa-0.3.48 → modusa-0.3.51}/src/modusa/decorators.py +0 -0
  10. {modusa-0.3.48 → modusa-0.3.51}/src/modusa/devtools/generate_docs_source.py +0 -0
  11. {modusa-0.3.48 → modusa-0.3.51}/src/modusa/devtools/generate_template.py +0 -0
  12. {modusa-0.3.48 → modusa-0.3.51}/src/modusa/devtools/list_authors.py +0 -0
  13. {modusa-0.3.48 → modusa-0.3.51}/src/modusa/devtools/list_plugins.py +0 -0
  14. {modusa-0.3.48 → modusa-0.3.51}/src/modusa/devtools/main.py +0 -0
  15. {modusa-0.3.48 → modusa-0.3.51}/src/modusa/devtools/templates/generator.py +0 -0
  16. {modusa-0.3.48 → modusa-0.3.51}/src/modusa/devtools/templates/io.py +0 -0
  17. {modusa-0.3.48 → modusa-0.3.51}/src/modusa/devtools/templates/model.py +0 -0
  18. {modusa-0.3.48 → modusa-0.3.51}/src/modusa/devtools/templates/plugin.py +0 -0
  19. {modusa-0.3.48 → modusa-0.3.51}/src/modusa/devtools/templates/test.py +0 -0
  20. {modusa-0.3.48 → modusa-0.3.51}/src/modusa/devtools/templates/tool.py +0 -0
  21. {modusa-0.3.48 → modusa-0.3.51}/src/modusa/fonts/NotoSansDevanagari-Regular.ttf +0 -0
  22. {modusa-0.3.48 → modusa-0.3.51}/src/modusa/generators/__init__.py +0 -0
  23. {modusa-0.3.48 → modusa-0.3.51}/src/modusa/generators/audio.py +0 -0
  24. {modusa-0.3.48 → modusa-0.3.51}/src/modusa/generators/audio_waveforms.py +0 -0
  25. {modusa-0.3.48 → modusa-0.3.51}/src/modusa/generators/base.py +0 -0
  26. {modusa-0.3.48 → modusa-0.3.51}/src/modusa/generators/ftds.py +0 -0
  27. {modusa-0.3.48 → modusa-0.3.51}/src/modusa/generators/s1d.py +0 -0
  28. {modusa-0.3.48 → modusa-0.3.51}/src/modusa/generators/s2d.py +0 -0
  29. {modusa-0.3.48 → modusa-0.3.51}/src/modusa/generators/s_ax.py +0 -0
  30. {modusa-0.3.48 → modusa-0.3.51}/src/modusa/generators/t_ax.py +0 -0
  31. {modusa-0.3.48 → modusa-0.3.51}/src/modusa/generators/tds.py +0 -0
  32. {modusa-0.3.48 → modusa-0.3.51}/src/modusa/models/__init__.py +0 -0
  33. {modusa-0.3.48 → modusa-0.3.51}/src/modusa/models/__pycache__/signal1D.cpython-312.pyc.4443461152 +0 -0
  34. {modusa-0.3.48 → modusa-0.3.51}/src/modusa/models/audio.py +0 -0
  35. {modusa-0.3.48 → modusa-0.3.51}/src/modusa/models/base.py +0 -0
  36. {modusa-0.3.48 → modusa-0.3.51}/src/modusa/models/data.py +0 -0
  37. {modusa-0.3.48 → modusa-0.3.51}/src/modusa/models/ftds.py +0 -0
  38. {modusa-0.3.48 → modusa-0.3.51}/src/modusa/models/s1d.py +0 -0
  39. {modusa-0.3.48 → modusa-0.3.51}/src/modusa/models/s2d.py +0 -0
  40. {modusa-0.3.48 → modusa-0.3.51}/src/modusa/models/s_ax.py +0 -0
  41. {modusa-0.3.48 → modusa-0.3.51}/src/modusa/models/t_ax.py +0 -0
  42. {modusa-0.3.48 → modusa-0.3.51}/src/modusa/models/tds.py +0 -0
  43. {modusa-0.3.48 → modusa-0.3.51}/src/modusa/plugins/__init__.py +0 -0
  44. {modusa-0.3.48 → modusa-0.3.51}/src/modusa/plugins/base.py +0 -0
  45. {modusa-0.3.48 → modusa-0.3.51}/src/modusa/tools/__init__.py +0 -0
  46. {modusa-0.3.48 → modusa-0.3.51}/src/modusa/tools/_plotter_old.py +0 -0
  47. {modusa-0.3.48 → modusa-0.3.51}/src/modusa/tools/ann_loader.py +0 -0
  48. {modusa-0.3.48 → modusa-0.3.51}/src/modusa/tools/audio_converter.py +0 -0
  49. {modusa-0.3.48 → modusa-0.3.51}/src/modusa/tools/audio_loader.py +0 -0
  50. {modusa-0.3.48 → modusa-0.3.51}/src/modusa/tools/audio_player.py +0 -0
  51. {modusa-0.3.48 → modusa-0.3.51}/src/modusa/tools/audio_recorder.py +0 -0
  52. {modusa-0.3.48 → modusa-0.3.51}/src/modusa/tools/base.py +0 -0
  53. {modusa-0.3.48 → modusa-0.3.51}/src/modusa/tools/math_ops.py +0 -0
  54. {modusa-0.3.48 → modusa-0.3.51}/src/modusa/tools/youtube_downloader.py +0 -0
  55. {modusa-0.3.48 → modusa-0.3.51}/src/modusa/utils/.DS_Store +0 -0
  56. {modusa-0.3.48 → modusa-0.3.51}/src/modusa/utils/__init__.py +0 -0
  57. {modusa-0.3.48 → modusa-0.3.51}/src/modusa/utils/config.py +0 -0
  58. {modusa-0.3.48 → modusa-0.3.51}/src/modusa/utils/excp.py +0 -0
  59. {modusa-0.3.48 → modusa-0.3.51}/src/modusa/utils/logger.py +0 -0
  60. {modusa-0.3.48 → modusa-0.3.51}/src/modusa/utils/np_func_cat.py +0 -0
  61. {modusa-0.3.48 → modusa-0.3.51}/src/modusa/utils/plot.py +0 -0
  62. {modusa-0.3.48 → modusa-0.3.51}/tests/__init__.py +0 -0
  63. {modusa-0.3.48 → modusa-0.3.51}/tests/data/song1.mp3 +0 -0
  64. {modusa-0.3.48 → modusa-0.3.51}/tests/data/song1.wav +0 -0
  65. {modusa-0.3.48 → modusa-0.3.51}/tests/test_generators/audio_waveform.py +0 -0
  66. {modusa-0.3.48 → modusa-0.3.51}/tests/test_generators/test_audio.py +0 -0
  67. {modusa-0.3.48 → modusa-0.3.51}/tests/test_generators/test_ftds.py +0 -0
  68. {modusa-0.3.48 → modusa-0.3.51}/tests/test_generators/test_s1d.py +0 -0
  69. {modusa-0.3.48 → modusa-0.3.51}/tests/test_generators/test_s2d.py +0 -0
  70. {modusa-0.3.48 → modusa-0.3.51}/tests/test_generators/test_s_ax.py +0 -0
  71. {modusa-0.3.48 → modusa-0.3.51}/tests/test_generators/test_signal.py +0 -0
  72. {modusa-0.3.48 → modusa-0.3.51}/tests/test_generators/test_signal_generator.py +0 -0
  73. {modusa-0.3.48 → modusa-0.3.51}/tests/test_generators/test_t_ax.py +0 -0
  74. {modusa-0.3.48 → modusa-0.3.51}/tests/test_generators/test_tds.py +0 -0
  75. {modusa-0.3.48 → modusa-0.3.51}/tests/test_io/audio_player.py +0 -0
  76. {modusa-0.3.48 → modusa-0.3.51}/tests/test_io/plotter.py +0 -0
  77. {modusa-0.3.48 → modusa-0.3.51}/tests/test_models/test_data.py +0 -0
  78. {modusa-0.3.48 → modusa-0.3.51}/tests/test_models/test_t_ax.py +0 -0
  79. {modusa-0.3.48 → modusa-0.3.51}/tests/test_plugins/youtube_audio_loader.py +0 -0
  80. {modusa-0.3.48 → modusa-0.3.51}/tests/test_signals/frequency_domain_signal.py +0 -0
  81. {modusa-0.3.48 → modusa-0.3.51}/tests/test_signals/spectrogram.py +0 -0
  82. {modusa-0.3.48 → modusa-0.3.51}/tests/test_signals/test_axis.py +0 -0
  83. {modusa-0.3.48 → modusa-0.3.51}/tests/test_signals/test_feature_time_domain_signal.py +0 -0
  84. {modusa-0.3.48 → modusa-0.3.51}/tests/test_signals/test_frequency_time_domain_signal.py +0 -0
  85. {modusa-0.3.48 → modusa-0.3.51}/tests/test_signals/test_signal1D.py +0 -0
  86. {modusa-0.3.48 → modusa-0.3.51}/tests/test_signals/test_signal2D.py +0 -0
  87. {modusa-0.3.48 → modusa-0.3.51}/tests/test_signals/test_time_domain_signal.py +0 -0
  88. {modusa-0.3.48 → modusa-0.3.51}/tests/test_signals/test_u_ax.py +0 -0
  89. {modusa-0.3.48 → modusa-0.3.51}/tests/test_signals/test_window_signal.py +0 -0
  90. {modusa-0.3.48 → modusa-0.3.51}/tests/test_signals/time_domain_signal.py +0 -0
  91. {modusa-0.3.48 → modusa-0.3.51}/tests/test_tools/test_audio_converter.py +0 -0
  92. {modusa-0.3.48 → modusa-0.3.51}/tests/test_tools/test_fourier_tranform.py +0 -0
  93. {modusa-0.3.48 → modusa-0.3.51}/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.48
3
+ Version: 0.3.51
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.48"
3
+ version = "0.3.51"
4
4
  description = "A modular signal analysis python library."
5
5
  authors = [
6
6
  { name = "Ankit Anand", email = "ankit0.anand0@gmail.com" },
@@ -915,14 +915,14 @@ class Fig:
915
915
 
916
916
  """
917
917
 
918
- def __init__(self, arrangement="asm", title="Untitled", xlabel="Time (sec)", xlim=None):
918
+ def __init__(self, arrangement="asm", xlim=None):
919
919
 
920
920
  self._xlim = xlim
921
921
  self._curr_row_idx = 1 # Starting from 1 because row 0 is reserved for reference subplot
922
922
  self._curr_color_idx = 0 # So that we have different color across all the subplots to avoid legend confusion
923
923
 
924
924
  # Subplot setup
925
- self._fig, self._axs = self._generate_subplots(arrangement, title, xlabel) # This will fill in the all the above variables
925
+ self._fig, self._axs = self._generate_subplots(arrangement) # This will fill in the all the above variables
926
926
 
927
927
 
928
928
  def _get_curr_row(self):
@@ -958,7 +958,7 @@ class Fig:
958
958
  return [x[0] - dx / 2, x[-1] + dx / 2, y[0] - dy / 2, y[-1] + dy / 2]
959
959
 
960
960
 
961
- def _generate_subplots(self, arrangement, title, xlabel):
961
+ def _generate_subplots(self, arrangement):
962
962
  """
963
963
  Generate subplots based on the configuration.
964
964
  """
@@ -1013,12 +1013,6 @@ class Fig:
1013
1013
  # xlim should be applied on reference subplot, rest all subplots will automatically adjust
1014
1014
  if xlim is not None:
1015
1015
  axs[0, 0].set_xlim(xlim)
1016
-
1017
- # Set title and label
1018
- if title is not None:
1019
- axs[0, 0].set_title(title)
1020
- if xlabel is not None:
1021
- axs[-1, 0].set_xlabel(xlabel)
1022
1016
 
1023
1017
  fig.subplots_adjust(hspace=0.2, wspace=0.05)
1024
1018
 
@@ -1103,7 +1097,7 @@ class Fig:
1103
1097
  label: str
1104
1098
  - Label for the plot.
1105
1099
  - Legend will use this.
1106
- - Default: "Signal"
1100
+ - Default: None
1107
1101
  ylabel: str
1108
1102
  - y-label for the plot.
1109
1103
  - Default: None
@@ -1159,7 +1153,7 @@ class Fig:
1159
1153
  label: str
1160
1154
  - Label for the event type.
1161
1155
  - This will appear in the legend.
1162
- - Default: "Event label"
1156
+ - Default: None
1163
1157
  ax: int
1164
1158
  - Which specific axis to plot (1, 2, 3, ...)
1165
1159
  - None
@@ -1188,7 +1182,7 @@ class Fig:
1188
1182
  else:
1189
1183
  curr_row[0].axvline(x=event, color=c, linestyle=ls, linewidth=lw)
1190
1184
 
1191
- def add_annotation(self, ann, ax=None):
1185
+ def add_annotation(self, ann, label=None, ax=None):
1192
1186
  """
1193
1187
  Add annotation to the figure.
1194
1188
 
@@ -1197,6 +1191,10 @@ class Fig:
1197
1191
  ann : list[tuple[Number, Number, str]] | None
1198
1192
  - A list of annotation spans. Each tuple should be (start, end, label).
1199
1193
  - Default: None (no annotations).
1194
+ label: str
1195
+ - Label for the annotation type.
1196
+ - This will appear to the right of the aux plot.
1197
+ - Default: None
1200
1198
  ax: int
1201
1199
  - Which specific axis to plot (1, 2, 3, ...)
1202
1200
  - None
@@ -1248,6 +1246,11 @@ class Fig:
1248
1246
 
1249
1247
  text_obj.set_clip_path(rect)
1250
1248
 
1249
+ if label is not None:
1250
+ curr_row[0].set_ylabel(label, rotation=0, ha="center", va="center")
1251
+ curr_row[0].yaxis.set_label_position("right")
1252
+ curr_row[0].yaxis.set_label_coords(1.05, 0.75)
1253
+
1251
1254
  def add_legend(self, ypos=1.0):
1252
1255
  """
1253
1256
  Add legend to the figure.
@@ -1276,6 +1279,47 @@ class Fig:
1276
1279
  # remove duplicates if needed
1277
1280
  fig.legend(all_handles, all_labels, loc='upper right', bbox_to_anchor=(0.95, ypos), ncol=2, frameon=True, bbox_transform=fig.transFigure)
1278
1281
 
1282
+ def add_title(self, title=None, s=13):
1283
+ """
1284
+ Add title to the figure.
1285
+
1286
+ Parameters
1287
+ ----------
1288
+ title: str | None
1289
+ - Title of the figure.
1290
+ - Default: None
1291
+ s: Number
1292
+ - Font size.
1293
+ - Default: None
1294
+ """
1295
+ axs = self._axs
1296
+ ref_ax = axs[0, 0] # Title is added to the top subplot (ref subplot)
1297
+
1298
+ if title is not None:
1299
+ ref_ax.set_title(title, pad=10, size=s)
1300
+
1301
+
1302
+ def add_xlabel(self, xlabel=None, s=None):
1303
+ """
1304
+ Add shared x-label to the figure.
1305
+
1306
+ Parameters
1307
+ ----------
1308
+ xlabel: str | None
1309
+ - xlabel for the figure.
1310
+ - Default: None
1311
+ s: Number
1312
+ - Font size.
1313
+ - Default: None
1314
+ """
1315
+ axs = self._axs
1316
+ ref_ax = axs[-1, 0] # X-label is added to the last subplot
1317
+ if xlabel is not None:
1318
+ ref_ax.set_xlabel(xlabel, size=s)
1319
+
1320
+ def add_xticks():
1321
+ raise NotImplementedError("Please raise a github issue `https://github.com/meluron-toolbox/modusa/issues`")
1322
+
1279
1323
  def save(self, path="./figure.png"):
1280
1324
  """
1281
1325
  Save the figure.
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes