modusa 0.3.31__tar.gz → 0.3.41__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 (91) hide show
  1. {modusa-0.3.31 → modusa-0.3.41}/PKG-INFO +1 -1
  2. {modusa-0.3.31 → modusa-0.3.41}/pyproject.toml +1 -1
  3. modusa-0.3.41/src/modusa/fonts/NotoSansDevanagari-Regular.ttf +0 -0
  4. {modusa-0.3.31 → modusa-0.3.41}/src/modusa/tools/plotter.py +52 -12
  5. {modusa-0.3.31 → modusa-0.3.41}/LICENSE.md +0 -0
  6. {modusa-0.3.31 → modusa-0.3.41}/README.md +0 -0
  7. {modusa-0.3.31 → modusa-0.3.41}/src/modusa/.DS_Store +0 -0
  8. {modusa-0.3.31 → modusa-0.3.41}/src/modusa/__init__.py +0 -0
  9. {modusa-0.3.31 → modusa-0.3.41}/src/modusa/config.py +0 -0
  10. {modusa-0.3.31 → modusa-0.3.41}/src/modusa/decorators.py +0 -0
  11. {modusa-0.3.31 → modusa-0.3.41}/src/modusa/devtools/generate_docs_source.py +0 -0
  12. {modusa-0.3.31 → modusa-0.3.41}/src/modusa/devtools/generate_template.py +0 -0
  13. {modusa-0.3.31 → modusa-0.3.41}/src/modusa/devtools/list_authors.py +0 -0
  14. {modusa-0.3.31 → modusa-0.3.41}/src/modusa/devtools/list_plugins.py +0 -0
  15. {modusa-0.3.31 → modusa-0.3.41}/src/modusa/devtools/main.py +0 -0
  16. {modusa-0.3.31 → modusa-0.3.41}/src/modusa/devtools/templates/generator.py +0 -0
  17. {modusa-0.3.31 → modusa-0.3.41}/src/modusa/devtools/templates/io.py +0 -0
  18. {modusa-0.3.31 → modusa-0.3.41}/src/modusa/devtools/templates/model.py +0 -0
  19. {modusa-0.3.31 → modusa-0.3.41}/src/modusa/devtools/templates/plugin.py +0 -0
  20. {modusa-0.3.31 → modusa-0.3.41}/src/modusa/devtools/templates/test.py +0 -0
  21. {modusa-0.3.31 → modusa-0.3.41}/src/modusa/devtools/templates/tool.py +0 -0
  22. {modusa-0.3.31 → modusa-0.3.41}/src/modusa/generators/__init__.py +0 -0
  23. {modusa-0.3.31 → modusa-0.3.41}/src/modusa/generators/audio.py +0 -0
  24. {modusa-0.3.31 → modusa-0.3.41}/src/modusa/generators/audio_waveforms.py +0 -0
  25. {modusa-0.3.31 → modusa-0.3.41}/src/modusa/generators/base.py +0 -0
  26. {modusa-0.3.31 → modusa-0.3.41}/src/modusa/generators/ftds.py +0 -0
  27. {modusa-0.3.31 → modusa-0.3.41}/src/modusa/generators/s1d.py +0 -0
  28. {modusa-0.3.31 → modusa-0.3.41}/src/modusa/generators/s2d.py +0 -0
  29. {modusa-0.3.31 → modusa-0.3.41}/src/modusa/generators/s_ax.py +0 -0
  30. {modusa-0.3.31 → modusa-0.3.41}/src/modusa/generators/t_ax.py +0 -0
  31. {modusa-0.3.31 → modusa-0.3.41}/src/modusa/generators/tds.py +0 -0
  32. {modusa-0.3.31 → modusa-0.3.41}/src/modusa/models/__init__.py +0 -0
  33. {modusa-0.3.31 → modusa-0.3.41}/src/modusa/models/__pycache__/signal1D.cpython-312.pyc.4443461152 +0 -0
  34. {modusa-0.3.31 → modusa-0.3.41}/src/modusa/models/audio.py +0 -0
  35. {modusa-0.3.31 → modusa-0.3.41}/src/modusa/models/base.py +0 -0
  36. {modusa-0.3.31 → modusa-0.3.41}/src/modusa/models/data.py +0 -0
  37. {modusa-0.3.31 → modusa-0.3.41}/src/modusa/models/ftds.py +0 -0
  38. {modusa-0.3.31 → modusa-0.3.41}/src/modusa/models/s1d.py +0 -0
  39. {modusa-0.3.31 → modusa-0.3.41}/src/modusa/models/s2d.py +0 -0
  40. {modusa-0.3.31 → modusa-0.3.41}/src/modusa/models/s_ax.py +0 -0
  41. {modusa-0.3.31 → modusa-0.3.41}/src/modusa/models/t_ax.py +0 -0
  42. {modusa-0.3.31 → modusa-0.3.41}/src/modusa/models/tds.py +0 -0
  43. {modusa-0.3.31 → modusa-0.3.41}/src/modusa/plugins/__init__.py +0 -0
  44. {modusa-0.3.31 → modusa-0.3.41}/src/modusa/plugins/base.py +0 -0
  45. {modusa-0.3.31 → modusa-0.3.41}/src/modusa/tools/__init__.py +0 -0
  46. {modusa-0.3.31 → modusa-0.3.41}/src/modusa/tools/ann_loader.py +0 -0
  47. {modusa-0.3.31 → modusa-0.3.41}/src/modusa/tools/audio_converter.py +0 -0
  48. {modusa-0.3.31 → modusa-0.3.41}/src/modusa/tools/audio_loader.py +0 -0
  49. {modusa-0.3.31 → modusa-0.3.41}/src/modusa/tools/audio_player.py +0 -0
  50. {modusa-0.3.31 → modusa-0.3.41}/src/modusa/tools/base.py +0 -0
  51. {modusa-0.3.31 → modusa-0.3.41}/src/modusa/tools/math_ops.py +0 -0
  52. {modusa-0.3.31 → modusa-0.3.41}/src/modusa/tools/youtube_downloader.py +0 -0
  53. {modusa-0.3.31 → modusa-0.3.41}/src/modusa/utils/.DS_Store +0 -0
  54. {modusa-0.3.31 → modusa-0.3.41}/src/modusa/utils/__init__.py +0 -0
  55. {modusa-0.3.31 → modusa-0.3.41}/src/modusa/utils/config.py +0 -0
  56. {modusa-0.3.31 → modusa-0.3.41}/src/modusa/utils/excp.py +0 -0
  57. {modusa-0.3.31 → modusa-0.3.41}/src/modusa/utils/logger.py +0 -0
  58. {modusa-0.3.31 → modusa-0.3.41}/src/modusa/utils/np_func_cat.py +0 -0
  59. {modusa-0.3.31 → modusa-0.3.41}/src/modusa/utils/plot.py +0 -0
  60. {modusa-0.3.31 → modusa-0.3.41}/tests/__init__.py +0 -0
  61. {modusa-0.3.31 → modusa-0.3.41}/tests/data/song1.mp3 +0 -0
  62. {modusa-0.3.31 → modusa-0.3.41}/tests/data/song1.wav +0 -0
  63. {modusa-0.3.31 → modusa-0.3.41}/tests/test_generators/audio_waveform.py +0 -0
  64. {modusa-0.3.31 → modusa-0.3.41}/tests/test_generators/test_audio.py +0 -0
  65. {modusa-0.3.31 → modusa-0.3.41}/tests/test_generators/test_ftds.py +0 -0
  66. {modusa-0.3.31 → modusa-0.3.41}/tests/test_generators/test_s1d.py +0 -0
  67. {modusa-0.3.31 → modusa-0.3.41}/tests/test_generators/test_s2d.py +0 -0
  68. {modusa-0.3.31 → modusa-0.3.41}/tests/test_generators/test_s_ax.py +0 -0
  69. {modusa-0.3.31 → modusa-0.3.41}/tests/test_generators/test_signal.py +0 -0
  70. {modusa-0.3.31 → modusa-0.3.41}/tests/test_generators/test_signal_generator.py +0 -0
  71. {modusa-0.3.31 → modusa-0.3.41}/tests/test_generators/test_t_ax.py +0 -0
  72. {modusa-0.3.31 → modusa-0.3.41}/tests/test_generators/test_tds.py +0 -0
  73. {modusa-0.3.31 → modusa-0.3.41}/tests/test_io/audio_player.py +0 -0
  74. {modusa-0.3.31 → modusa-0.3.41}/tests/test_io/plotter.py +0 -0
  75. {modusa-0.3.31 → modusa-0.3.41}/tests/test_models/test_data.py +0 -0
  76. {modusa-0.3.31 → modusa-0.3.41}/tests/test_models/test_t_ax.py +0 -0
  77. {modusa-0.3.31 → modusa-0.3.41}/tests/test_plugins/youtube_audio_loader.py +0 -0
  78. {modusa-0.3.31 → modusa-0.3.41}/tests/test_signals/frequency_domain_signal.py +0 -0
  79. {modusa-0.3.31 → modusa-0.3.41}/tests/test_signals/spectrogram.py +0 -0
  80. {modusa-0.3.31 → modusa-0.3.41}/tests/test_signals/test_axis.py +0 -0
  81. {modusa-0.3.31 → modusa-0.3.41}/tests/test_signals/test_feature_time_domain_signal.py +0 -0
  82. {modusa-0.3.31 → modusa-0.3.41}/tests/test_signals/test_frequency_time_domain_signal.py +0 -0
  83. {modusa-0.3.31 → modusa-0.3.41}/tests/test_signals/test_signal1D.py +0 -0
  84. {modusa-0.3.31 → modusa-0.3.41}/tests/test_signals/test_signal2D.py +0 -0
  85. {modusa-0.3.31 → modusa-0.3.41}/tests/test_signals/test_time_domain_signal.py +0 -0
  86. {modusa-0.3.31 → modusa-0.3.41}/tests/test_signals/test_u_ax.py +0 -0
  87. {modusa-0.3.31 → modusa-0.3.41}/tests/test_signals/test_window_signal.py +0 -0
  88. {modusa-0.3.31 → modusa-0.3.41}/tests/test_signals/time_domain_signal.py +0 -0
  89. {modusa-0.3.31 → modusa-0.3.41}/tests/test_tools/test_audio_converter.py +0 -0
  90. {modusa-0.3.31 → modusa-0.3.41}/tests/test_tools/test_fourier_tranform.py +0 -0
  91. {modusa-0.3.31 → modusa-0.3.41}/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.31
3
+ Version: 0.3.41
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.31"
3
+ version = "0.3.41"
4
4
  description = "A modular signal analysis python library."
5
5
  authors = [
6
6
  { name = "Ankit Anand", email = "ankit0.anand0@gmail.com" },
@@ -25,9 +25,31 @@ def _calculate_extent(x, y):
25
25
  y[0] - dy / 2,
26
26
  y[-1] + dy / 2
27
27
  ]
28
+
29
+ # Helper to load fonts (devnagri)
30
+ def set_default_hindi_font():
31
+ """
32
+ Hindi fonts works for both english and hindi.
33
+ """
34
+ from pathlib import Path
35
+ import matplotlib as mpl
36
+ import matplotlib.font_manager as fm
37
+ # Path to your bundled font
38
+ font_path = Path(__file__).resolve().parents[1] / "fonts" / "NotoSansDevanagari-Regular.ttf"
39
+
40
+ # Register the font with matplotlib
41
+ fm.fontManager.addfont(str(font_path))
42
+
43
+ # Get the font family name from the file
44
+ hindi_font = fm.FontProperties(fname=str(font_path))
45
+
46
+ # Set as default rcParam
47
+ mpl.rcParams['font.family'] = hindi_font.get_name()
48
+
49
+ set_default_hindi_font()
28
50
 
29
51
  #======== 1D ===========
30
- def plot1d(*args, ann=None, events=None, xlim=None, ylim=None, xlabel=None, ylabel=None, title=None, legend=None, show_grid=False, show_stem=False):
52
+ def plot1d(*args, ann=None, events=None, xlim=None, ylim=None, xlabel=None, ylabel=None, title=None, legend=None, fmt=None, show_grid=False, show_stem=False):
31
53
  """
32
54
  Plots a 1D signal using matplotlib.
33
55
 
@@ -72,6 +94,9 @@ def plot1d(*args, ann=None, events=None, xlim=None, ylim=None, xlabel=None, ylab
72
94
  legend : list[str] | None
73
95
  - List of legend labels corresponding to each signal if plotting multiple lines.
74
96
  - Default: None
97
+ fmt: list[str] | None
98
+ - linefmt for different line plots.
99
+ - Default: None
75
100
  show_grid: bool
76
101
  - If you want to show the grid.
77
102
  - Default: False
@@ -84,21 +109,24 @@ def plot1d(*args, ann=None, events=None, xlim=None, ylim=None, xlabel=None, ylab
84
109
  plt.Figure
85
110
  Matplolib figure.
86
111
  """
87
-
88
112
  for arg in args:
89
113
  if len(arg) not in [1, 2]: # 1 if it just provides values, 2 if it provided axis as well
90
114
  raise ValueError(f"1D signal needs to have max 2 arrays (y, x) or simply (y, )")
91
115
 
92
116
  if isinstance(legend, str): legend = (legend, )
93
-
94
117
  if legend is not None:
95
118
  if len(legend) < len(args):
96
- raise ValueError(f"Legend should be provided for each signal.")
119
+ raise ValueError(f"`legend` should be provided for each signal.")
120
+
121
+ if isinstance(fmt, str): fmt = [fmt]
122
+ if fmt is not None:
123
+ if len(fmt) < len(args):
124
+ raise ValueError(f"`fmt` should be provided for each signal.")
125
+
126
+ colors = plt.get_cmap('tab10').colors
97
127
 
98
128
  fig = plt.figure(figsize=(16, 2))
99
129
  gs = gridspec.GridSpec(2, 1, height_ratios=[0.2, 1])
100
-
101
- colors = plt.get_cmap('tab10').colors
102
130
 
103
131
  signal_ax = fig.add_subplot(gs[1, 0])
104
132
  annotation_ax = fig.add_subplot(gs[0, 0], sharex=signal_ax)
@@ -109,7 +137,6 @@ def plot1d(*args, ann=None, events=None, xlim=None, ylim=None, xlabel=None, ylab
109
137
 
110
138
  if ylim is not None:
111
139
  signal_ax.set_ylim(ylim)
112
-
113
140
 
114
141
  # Add signal plot
115
142
  for i, signal in enumerate(args):
@@ -123,7 +150,10 @@ def plot1d(*args, ann=None, events=None, xlim=None, ylim=None, xlabel=None, ylab
123
150
  stemlines.set_color(colors[i])
124
151
  baseline.set_color("k")
125
152
  else:
126
- signal_ax.plot(x, y, color=colors[i], label=legend[i])
153
+ if fmt is not None:
154
+ signal_ax.plot(x, y, fmt[i], markersize=4, label=legend[i])
155
+ else:
156
+ signal_ax.plot(x, y, color=colors[i], label=legend[i])
127
157
  else:
128
158
  if show_stem is True:
129
159
  markerline, stemlines, baseline = signal_ax.stem(x, y)
@@ -131,7 +161,10 @@ def plot1d(*args, ann=None, events=None, xlim=None, ylim=None, xlabel=None, ylab
131
161
  stemlines.set_color(colors[i])
132
162
  baseline.set_color("k")
133
163
  else:
134
- signal_ax.plot(x, y, color=colors[i])
164
+ if fmt is not None:
165
+ signal_ax.plot(x, y, fmt[i], markersize=4)
166
+ else:
167
+ signal_ax.plot(x, y, color=colors[i])
135
168
 
136
169
  elif len(signal) == 2:
137
170
  y, x = signal[0], signal[1]
@@ -142,15 +175,22 @@ def plot1d(*args, ann=None, events=None, xlim=None, ylim=None, xlabel=None, ylab
142
175
  stemlines.set_color(colors[i])
143
176
  baseline.set_color("k")
144
177
  else:
145
- signal_ax.plot(x, y, color=colors[i], label=legend[i])
178
+ if fmt is not None:
179
+ signal_ax.plot(x, y, fmt[i], markersize=4, label=legend[i])
180
+ else:
181
+ signal_ax.plot(x, y, color=colors[i], label=legend[i])
146
182
  else:
147
183
  if show_stem is True:
148
- markerline, stemlines, baseline = signal_ax.stem(x, y, label=legend[i])
184
+ markerline, stemlines, baseline = signal_ax.stem(x, y)
149
185
  markerline.set_color(colors[i])
150
186
  stemlines.set_color(colors[i])
151
187
  baseline.set_color("k")
152
188
  else:
153
- signal_ax.plot(x, y, color=colors[i])
189
+ if fmt is not None:
190
+ signal_ax.plot(x, y, fmt[i], markersize=4)
191
+ else:
192
+ signal_ax.plot(x, y, color=colors[i])
193
+
154
194
 
155
195
  # Add annotations
156
196
  if ann is not None:
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes