scitex 2.7.0__py3-none-any.whl → 2.7.3__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 (297) hide show
  1. scitex/__init__.py +6 -2
  2. scitex/__version__.py +1 -1
  3. scitex/audio/README.md +52 -0
  4. scitex/audio/__init__.py +384 -0
  5. scitex/audio/__main__.py +129 -0
  6. scitex/audio/_tts.py +334 -0
  7. scitex/audio/engines/__init__.py +44 -0
  8. scitex/audio/engines/base.py +275 -0
  9. scitex/audio/engines/elevenlabs_engine.py +143 -0
  10. scitex/audio/engines/gtts_engine.py +162 -0
  11. scitex/audio/engines/pyttsx3_engine.py +131 -0
  12. scitex/audio/mcp_server.py +757 -0
  13. scitex/bridge/_helpers.py +1 -1
  14. scitex/bridge/_plt_vis.py +1 -1
  15. scitex/bridge/_stats_vis.py +1 -1
  16. scitex/dev/plt/__init__.py +272 -0
  17. scitex/dev/plt/plot_mpl_axhline.py +28 -0
  18. scitex/dev/plt/plot_mpl_axhspan.py +28 -0
  19. scitex/dev/plt/plot_mpl_axvline.py +28 -0
  20. scitex/dev/plt/plot_mpl_axvspan.py +28 -0
  21. scitex/dev/plt/plot_mpl_bar.py +29 -0
  22. scitex/dev/plt/plot_mpl_barh.py +29 -0
  23. scitex/dev/plt/plot_mpl_boxplot.py +28 -0
  24. scitex/dev/plt/plot_mpl_contour.py +31 -0
  25. scitex/dev/plt/plot_mpl_contourf.py +31 -0
  26. scitex/dev/plt/plot_mpl_errorbar.py +30 -0
  27. scitex/dev/plt/plot_mpl_eventplot.py +28 -0
  28. scitex/dev/plt/plot_mpl_fill.py +30 -0
  29. scitex/dev/plt/plot_mpl_fill_between.py +31 -0
  30. scitex/dev/plt/plot_mpl_hexbin.py +28 -0
  31. scitex/dev/plt/plot_mpl_hist.py +28 -0
  32. scitex/dev/plt/plot_mpl_hist2d.py +28 -0
  33. scitex/dev/plt/plot_mpl_imshow.py +29 -0
  34. scitex/dev/plt/plot_mpl_pcolormesh.py +31 -0
  35. scitex/dev/plt/plot_mpl_pie.py +29 -0
  36. scitex/dev/plt/plot_mpl_plot.py +29 -0
  37. scitex/dev/plt/plot_mpl_quiver.py +31 -0
  38. scitex/dev/plt/plot_mpl_scatter.py +28 -0
  39. scitex/dev/plt/plot_mpl_stackplot.py +31 -0
  40. scitex/dev/plt/plot_mpl_stem.py +29 -0
  41. scitex/dev/plt/plot_mpl_step.py +29 -0
  42. scitex/dev/plt/plot_mpl_violinplot.py +28 -0
  43. scitex/dev/plt/plot_sns_barplot.py +29 -0
  44. scitex/dev/plt/plot_sns_boxplot.py +29 -0
  45. scitex/dev/plt/plot_sns_heatmap.py +28 -0
  46. scitex/dev/plt/plot_sns_histplot.py +29 -0
  47. scitex/dev/plt/plot_sns_kdeplot.py +29 -0
  48. scitex/dev/plt/plot_sns_lineplot.py +31 -0
  49. scitex/dev/plt/plot_sns_scatterplot.py +29 -0
  50. scitex/dev/plt/plot_sns_stripplot.py +29 -0
  51. scitex/dev/plt/plot_sns_swarmplot.py +29 -0
  52. scitex/dev/plt/plot_sns_violinplot.py +29 -0
  53. scitex/dev/plt/plot_stx_bar.py +29 -0
  54. scitex/dev/plt/plot_stx_barh.py +29 -0
  55. scitex/dev/plt/plot_stx_box.py +28 -0
  56. scitex/dev/plt/plot_stx_boxplot.py +28 -0
  57. scitex/dev/plt/plot_stx_conf_mat.py +28 -0
  58. scitex/dev/plt/plot_stx_contour.py +31 -0
  59. scitex/dev/plt/plot_stx_ecdf.py +28 -0
  60. scitex/dev/plt/plot_stx_errorbar.py +30 -0
  61. scitex/dev/plt/plot_stx_fill_between.py +31 -0
  62. scitex/dev/plt/plot_stx_fillv.py +28 -0
  63. scitex/dev/plt/plot_stx_heatmap.py +28 -0
  64. scitex/dev/plt/plot_stx_image.py +28 -0
  65. scitex/dev/plt/plot_stx_imshow.py +28 -0
  66. scitex/dev/plt/plot_stx_joyplot.py +28 -0
  67. scitex/dev/plt/plot_stx_kde.py +28 -0
  68. scitex/dev/plt/plot_stx_line.py +28 -0
  69. scitex/dev/plt/plot_stx_mean_ci.py +28 -0
  70. scitex/dev/plt/plot_stx_mean_std.py +28 -0
  71. scitex/dev/plt/plot_stx_median_iqr.py +28 -0
  72. scitex/dev/plt/plot_stx_raster.py +28 -0
  73. scitex/dev/plt/plot_stx_rectangle.py +28 -0
  74. scitex/dev/plt/plot_stx_scatter.py +29 -0
  75. scitex/dev/plt/plot_stx_shaded_line.py +29 -0
  76. scitex/dev/plt/plot_stx_violin.py +28 -0
  77. scitex/dev/plt/plot_stx_violinplot.py +28 -0
  78. scitex/fig/__init__.py +352 -0
  79. scitex/{vis → fig}/backend/_parser.py +1 -1
  80. scitex/{vis → fig}/canvas.py +1 -1
  81. scitex/{vis → fig}/editor/_defaults.py +70 -5
  82. scitex/fig/editor/_edit.py +751 -0
  83. scitex/{vis → fig}/editor/_qt_editor.py +181 -1
  84. scitex/fig/editor/flask_editor/_bbox.py +1276 -0
  85. scitex/fig/editor/flask_editor/_core.py +624 -0
  86. scitex/{vis → fig}/editor/flask_editor/_plotter.py +38 -4
  87. scitex/fig/editor/flask_editor/_renderer.py +739 -0
  88. scitex/{vis → fig}/editor/flask_editor/templates/__init__.py +1 -1
  89. scitex/fig/editor/flask_editor/templates/_html.py +834 -0
  90. scitex/fig/editor/flask_editor/templates/_scripts.py +3136 -0
  91. scitex/{vis → fig}/editor/flask_editor/templates/_styles.py +625 -18
  92. scitex/{vis → fig}/io/__init__.py +13 -1
  93. scitex/fig/io/_bundle.py +973 -0
  94. scitex/{vis → fig}/io/_canvas.py +1 -1
  95. scitex/{vis → fig}/io/_data.py +1 -1
  96. scitex/{vis → fig}/io/_export.py +1 -1
  97. scitex/{vis → fig}/io/_load.py +1 -1
  98. scitex/{vis → fig}/io/_panel.py +1 -1
  99. scitex/{vis → fig}/io/_save.py +1 -1
  100. scitex/{vis → fig}/model/__init__.py +1 -1
  101. scitex/{vis → fig}/model/_annotations.py +1 -1
  102. scitex/{vis → fig}/model/_axes.py +1 -1
  103. scitex/{vis → fig}/model/_figure.py +1 -1
  104. scitex/{vis → fig}/model/_guides.py +1 -1
  105. scitex/{vis → fig}/model/_plot.py +1 -1
  106. scitex/{vis → fig}/model/_styles.py +1 -1
  107. scitex/{vis → fig}/utils/__init__.py +1 -1
  108. scitex/io/__init__.py +10 -26
  109. scitex/io/_bundle.py +434 -0
  110. scitex/io/_flush.py +5 -2
  111. scitex/io/_load.py +98 -0
  112. scitex/io/_load_modules/_H5Explorer.py +5 -2
  113. scitex/io/_load_modules/_canvas.py +2 -2
  114. scitex/io/_load_modules/_image.py +3 -4
  115. scitex/io/_load_modules/_txt.py +4 -2
  116. scitex/io/_metadata.py +34 -324
  117. scitex/io/_metadata_modules/__init__.py +46 -0
  118. scitex/io/_metadata_modules/_embed.py +70 -0
  119. scitex/io/_metadata_modules/_read.py +64 -0
  120. scitex/io/_metadata_modules/_utils.py +79 -0
  121. scitex/io/_metadata_modules/embed_metadata_jpeg.py +74 -0
  122. scitex/io/_metadata_modules/embed_metadata_pdf.py +53 -0
  123. scitex/io/_metadata_modules/embed_metadata_png.py +26 -0
  124. scitex/io/_metadata_modules/embed_metadata_svg.py +62 -0
  125. scitex/io/_metadata_modules/read_metadata_jpeg.py +57 -0
  126. scitex/io/_metadata_modules/read_metadata_pdf.py +51 -0
  127. scitex/io/_metadata_modules/read_metadata_png.py +39 -0
  128. scitex/io/_metadata_modules/read_metadata_svg.py +44 -0
  129. scitex/io/_qr_utils.py +5 -3
  130. scitex/io/_save.py +548 -30
  131. scitex/io/_save_modules/_canvas.py +3 -3
  132. scitex/io/_save_modules/_image.py +5 -9
  133. scitex/io/_save_modules/_tex.py +7 -4
  134. scitex/io/utils/h5_to_zarr.py +11 -9
  135. scitex/msword/__init__.py +255 -0
  136. scitex/msword/profiles.py +357 -0
  137. scitex/msword/reader.py +753 -0
  138. scitex/msword/utils.py +289 -0
  139. scitex/msword/writer.py +362 -0
  140. scitex/plt/__init__.py +5 -2
  141. scitex/plt/_subplots/_AxesWrapper.py +6 -6
  142. scitex/plt/_subplots/_AxisWrapper.py +15 -9
  143. scitex/plt/_subplots/_AxisWrapperMixins/_AdjustmentMixin/__init__.py +36 -0
  144. scitex/plt/_subplots/_AxisWrapperMixins/_AdjustmentMixin/_labels.py +264 -0
  145. scitex/plt/_subplots/_AxisWrapperMixins/_AdjustmentMixin/_metadata.py +213 -0
  146. scitex/plt/_subplots/_AxisWrapperMixins/_AdjustmentMixin/_visual.py +128 -0
  147. scitex/plt/_subplots/_AxisWrapperMixins/_MatplotlibPlotMixin/__init__.py +59 -0
  148. scitex/plt/_subplots/_AxisWrapperMixins/_MatplotlibPlotMixin/_base.py +34 -0
  149. scitex/plt/_subplots/_AxisWrapperMixins/_MatplotlibPlotMixin/_scientific.py +593 -0
  150. scitex/plt/_subplots/_AxisWrapperMixins/_MatplotlibPlotMixin/_statistical.py +654 -0
  151. scitex/plt/_subplots/_AxisWrapperMixins/_MatplotlibPlotMixin/_stx_aliases.py +527 -0
  152. scitex/plt/_subplots/_AxisWrapperMixins/_RawMatplotlibMixin.py +321 -0
  153. scitex/plt/_subplots/_AxisWrapperMixins/_SeabornMixin/__init__.py +33 -0
  154. scitex/plt/_subplots/_AxisWrapperMixins/_SeabornMixin/_base.py +152 -0
  155. scitex/plt/_subplots/_AxisWrapperMixins/_SeabornMixin/_wrappers.py +600 -0
  156. scitex/plt/_subplots/_AxisWrapperMixins/__init__.py +79 -5
  157. scitex/plt/_subplots/_FigWrapper.py +6 -6
  158. scitex/plt/_subplots/_SubplotsWrapper.py +28 -18
  159. scitex/plt/_subplots/_export_as_csv.py +35 -5
  160. scitex/plt/_subplots/_export_as_csv_formatters/__init__.py +8 -0
  161. scitex/plt/_subplots/_export_as_csv_formatters/_format_annotate.py +10 -21
  162. scitex/plt/_subplots/_export_as_csv_formatters/_format_eventplot.py +18 -7
  163. scitex/plt/_subplots/_export_as_csv_formatters/_format_imshow2d.py +28 -12
  164. scitex/plt/_subplots/_export_as_csv_formatters/_format_matshow.py +10 -4
  165. scitex/plt/_subplots/_export_as_csv_formatters/_format_plot_imshow.py +13 -1
  166. scitex/plt/_subplots/_export_as_csv_formatters/_format_plot_kde.py +12 -2
  167. scitex/plt/_subplots/_export_as_csv_formatters/_format_plot_scatter.py +10 -3
  168. scitex/plt/_subplots/_export_as_csv_formatters/_format_quiver.py +10 -4
  169. scitex/plt/_subplots/_export_as_csv_formatters/_format_sns_jointplot.py +18 -3
  170. scitex/plt/_subplots/_export_as_csv_formatters/_format_sns_lineplot.py +44 -36
  171. scitex/plt/_subplots/_export_as_csv_formatters/_format_sns_pairplot.py +14 -2
  172. scitex/plt/_subplots/_export_as_csv_formatters/_format_streamplot.py +11 -5
  173. scitex/plt/_subplots/_export_as_csv_formatters/_format_stx_bar.py +84 -0
  174. scitex/plt/_subplots/_export_as_csv_formatters/_format_stx_barh.py +85 -0
  175. scitex/plt/_subplots/_export_as_csv_formatters/_format_stx_conf_mat.py +14 -3
  176. scitex/plt/_subplots/_export_as_csv_formatters/_format_stx_contour.py +54 -0
  177. scitex/plt/_subplots/_export_as_csv_formatters/_format_stx_ecdf.py +14 -2
  178. scitex/plt/_subplots/_export_as_csv_formatters/_format_stx_errorbar.py +120 -0
  179. scitex/plt/_subplots/_export_as_csv_formatters/_format_stx_heatmap.py +16 -6
  180. scitex/plt/_subplots/_export_as_csv_formatters/_format_stx_image.py +29 -19
  181. scitex/plt/_subplots/_export_as_csv_formatters/_format_stx_imshow.py +63 -0
  182. scitex/plt/_subplots/_export_as_csv_formatters/_format_stx_joyplot.py +22 -5
  183. scitex/plt/_subplots/_export_as_csv_formatters/_format_stx_mean_ci.py +18 -14
  184. scitex/plt/_subplots/_export_as_csv_formatters/_format_stx_mean_std.py +18 -14
  185. scitex/plt/_subplots/_export_as_csv_formatters/_format_stx_median_iqr.py +18 -14
  186. scitex/plt/_subplots/_export_as_csv_formatters/_format_stx_raster.py +10 -2
  187. scitex/plt/_subplots/_export_as_csv_formatters/_format_stx_scatter.py +51 -0
  188. scitex/plt/_subplots/_export_as_csv_formatters/_format_stx_scatter_hist.py +18 -9
  189. scitex/plt/ax/_plot/_stx_ecdf.py +4 -2
  190. scitex/plt/gallery/_generate.py +421 -14
  191. scitex/plt/io/__init__.py +53 -0
  192. scitex/plt/io/_bundle.py +490 -0
  193. scitex/plt/io/_layered_bundle.py +1343 -0
  194. scitex/plt/styles/SCITEX_STYLE.yaml +26 -0
  195. scitex/plt/styles/__init__.py +14 -0
  196. scitex/plt/styles/presets.py +78 -0
  197. scitex/plt/utils/__init__.py +13 -1
  198. scitex/plt/utils/_collect_figure_metadata.py +10 -14
  199. scitex/plt/utils/_configure_mpl.py +6 -18
  200. scitex/plt/utils/_crop.py +32 -14
  201. scitex/plt/utils/_csv_column_naming.py +54 -0
  202. scitex/plt/utils/_figure_mm.py +116 -1
  203. scitex/plt/utils/_hitmap.py +1643 -0
  204. scitex/plt/utils/metadata/__init__.py +25 -0
  205. scitex/plt/utils/metadata/_core.py +9 -10
  206. scitex/plt/utils/metadata/_dimensions.py +6 -3
  207. scitex/plt/utils/metadata/_editable_export.py +405 -0
  208. scitex/plt/utils/metadata/_geometry_extraction.py +570 -0
  209. scitex/schema/__init__.py +109 -16
  210. scitex/schema/_canvas.py +1 -1
  211. scitex/schema/_plot.py +1015 -0
  212. scitex/schema/_stats.py +2 -2
  213. scitex/stats/__init__.py +117 -0
  214. scitex/stats/io/__init__.py +29 -0
  215. scitex/stats/io/_bundle.py +156 -0
  216. scitex/tex/__init__.py +4 -0
  217. scitex/tex/_export.py +890 -0
  218. {scitex-2.7.0.dist-info → scitex-2.7.3.dist-info}/METADATA +11 -1
  219. {scitex-2.7.0.dist-info → scitex-2.7.3.dist-info}/RECORD +238 -170
  220. scitex/io/memo.md +0 -2827
  221. scitex/plt/REQUESTS.md +0 -191
  222. scitex/plt/_subplots/TODO.md +0 -53
  223. scitex/plt/_subplots/_AxisWrapperMixins/_AdjustmentMixin.py +0 -559
  224. scitex/plt/_subplots/_AxisWrapperMixins/_MatplotlibPlotMixin.py +0 -1609
  225. scitex/plt/_subplots/_AxisWrapperMixins/_SeabornMixin.py +0 -447
  226. scitex/plt/templates/research-master/scitex/vis/gallery/area/fill_between.json +0 -110
  227. scitex/plt/templates/research-master/scitex/vis/gallery/area/fill_betweenx.json +0 -88
  228. scitex/plt/templates/research-master/scitex/vis/gallery/area/stx_fill_between.json +0 -103
  229. scitex/plt/templates/research-master/scitex/vis/gallery/area/stx_fillv.json +0 -106
  230. scitex/plt/templates/research-master/scitex/vis/gallery/categorical/bar.json +0 -92
  231. scitex/plt/templates/research-master/scitex/vis/gallery/categorical/barh.json +0 -92
  232. scitex/plt/templates/research-master/scitex/vis/gallery/categorical/boxplot.json +0 -92
  233. scitex/plt/templates/research-master/scitex/vis/gallery/categorical/stx_bar.json +0 -84
  234. scitex/plt/templates/research-master/scitex/vis/gallery/categorical/stx_barh.json +0 -84
  235. scitex/plt/templates/research-master/scitex/vis/gallery/categorical/stx_box.json +0 -83
  236. scitex/plt/templates/research-master/scitex/vis/gallery/categorical/stx_boxplot.json +0 -93
  237. scitex/plt/templates/research-master/scitex/vis/gallery/categorical/stx_violin.json +0 -91
  238. scitex/plt/templates/research-master/scitex/vis/gallery/categorical/stx_violinplot.json +0 -91
  239. scitex/plt/templates/research-master/scitex/vis/gallery/categorical/violinplot.json +0 -91
  240. scitex/plt/templates/research-master/scitex/vis/gallery/contour/contour.json +0 -97
  241. scitex/plt/templates/research-master/scitex/vis/gallery/contour/contourf.json +0 -98
  242. scitex/plt/templates/research-master/scitex/vis/gallery/contour/stx_contour.json +0 -84
  243. scitex/plt/templates/research-master/scitex/vis/gallery/distribution/hist.json +0 -101
  244. scitex/plt/templates/research-master/scitex/vis/gallery/distribution/hist2d.json +0 -96
  245. scitex/plt/templates/research-master/scitex/vis/gallery/distribution/stx_ecdf.json +0 -95
  246. scitex/plt/templates/research-master/scitex/vis/gallery/distribution/stx_joyplot.json +0 -95
  247. scitex/plt/templates/research-master/scitex/vis/gallery/distribution/stx_kde.json +0 -93
  248. scitex/plt/templates/research-master/scitex/vis/gallery/grid/imshow.json +0 -95
  249. scitex/plt/templates/research-master/scitex/vis/gallery/grid/matshow.json +0 -95
  250. scitex/plt/templates/research-master/scitex/vis/gallery/grid/stx_conf_mat.json +0 -83
  251. scitex/plt/templates/research-master/scitex/vis/gallery/grid/stx_heatmap.json +0 -92
  252. scitex/plt/templates/research-master/scitex/vis/gallery/grid/stx_image.json +0 -121
  253. scitex/plt/templates/research-master/scitex/vis/gallery/grid/stx_imshow.json +0 -84
  254. scitex/plt/templates/research-master/scitex/vis/gallery/line/plot.json +0 -110
  255. scitex/plt/templates/research-master/scitex/vis/gallery/line/step.json +0 -92
  256. scitex/plt/templates/research-master/scitex/vis/gallery/line/stx_line.json +0 -95
  257. scitex/plt/templates/research-master/scitex/vis/gallery/line/stx_shaded_line.json +0 -96
  258. scitex/plt/templates/research-master/scitex/vis/gallery/scatter/hexbin.json +0 -95
  259. scitex/plt/templates/research-master/scitex/vis/gallery/scatter/scatter.json +0 -95
  260. scitex/plt/templates/research-master/scitex/vis/gallery/scatter/stem.json +0 -92
  261. scitex/plt/templates/research-master/scitex/vis/gallery/scatter/stx_scatter.json +0 -84
  262. scitex/plt/templates/research-master/scitex/vis/gallery/special/pie.json +0 -94
  263. scitex/plt/templates/research-master/scitex/vis/gallery/special/stx_raster.json +0 -109
  264. scitex/plt/templates/research-master/scitex/vis/gallery/special/stx_rectangle.json +0 -108
  265. scitex/plt/templates/research-master/scitex/vis/gallery/statistical/errorbar.json +0 -93
  266. scitex/plt/templates/research-master/scitex/vis/gallery/statistical/stx_errorbar.json +0 -84
  267. scitex/plt/templates/research-master/scitex/vis/gallery/statistical/stx_mean_ci.json +0 -96
  268. scitex/plt/templates/research-master/scitex/vis/gallery/statistical/stx_mean_std.json +0 -96
  269. scitex/plt/templates/research-master/scitex/vis/gallery/statistical/stx_median_iqr.json +0 -96
  270. scitex/plt/templates/research-master/scitex/vis/gallery/vector/quiver.json +0 -99
  271. scitex/plt/templates/research-master/scitex/vis/gallery/vector/streamplot.json +0 -100
  272. scitex/vis/__init__.py +0 -177
  273. scitex/vis/editor/_edit.py +0 -390
  274. scitex/vis/editor/flask_editor/_bbox.py +0 -529
  275. scitex/vis/editor/flask_editor/_core.py +0 -168
  276. scitex/vis/editor/flask_editor/_renderer.py +0 -393
  277. scitex/vis/editor/flask_editor/templates/_html.py +0 -513
  278. scitex/vis/editor/flask_editor/templates/_scripts.py +0 -1261
  279. /scitex/{vis → fig}/README.md +0 -0
  280. /scitex/{vis → fig}/backend/__init__.py +0 -0
  281. /scitex/{vis → fig}/backend/_export.py +0 -0
  282. /scitex/{vis → fig}/backend/_render.py +0 -0
  283. /scitex/{vis → fig}/docs/CANVAS_ARCHITECTURE.md +0 -0
  284. /scitex/{vis → fig}/editor/__init__.py +0 -0
  285. /scitex/{vis → fig}/editor/_dearpygui_editor.py +0 -0
  286. /scitex/{vis → fig}/editor/_flask_editor.py +0 -0
  287. /scitex/{vis → fig}/editor/_mpl_editor.py +0 -0
  288. /scitex/{vis → fig}/editor/_tkinter_editor.py +0 -0
  289. /scitex/{vis → fig}/editor/flask_editor/__init__.py +0 -0
  290. /scitex/{vis → fig}/editor/flask_editor/_utils.py +0 -0
  291. /scitex/{vis → fig}/io/_directory.py +0 -0
  292. /scitex/{vis → fig}/model/_plot_types.py +0 -0
  293. /scitex/{vis → fig}/utils/_defaults.py +0 -0
  294. /scitex/{vis → fig}/utils/_validate.py +0 -0
  295. {scitex-2.7.0.dist-info → scitex-2.7.3.dist-info}/WHEEL +0 -0
  296. {scitex-2.7.0.dist-info → scitex-2.7.3.dist-info}/entry_points.txt +0 -0
  297. {scitex-2.7.0.dist-info → scitex-2.7.3.dist-info}/licenses/LICENSE +0 -0
@@ -0,0 +1,29 @@
1
+ #!/usr/bin/env python3
2
+ # -*- coding: utf-8 -*-
3
+ # File: plot_stx_scatter.py - stx_scatter demo
4
+
5
+ """stx_scatter: x, y arrays."""
6
+
7
+ import numpy as np
8
+
9
+
10
+ def plot_stx_scatter(plt, rng, ax=None):
11
+ """stx_scatter - x, y arrays.
12
+
13
+ Demonstrates: ax.stx_scatter()
14
+ """
15
+ if ax is None:
16
+ fig, ax = plt.subplots()
17
+ else:
18
+ fig = ax.get_figure() if hasattr(ax, "get_figure") else ax._fig_scitex
19
+
20
+ x = rng.uniform(0, 10, 50)
21
+ y = 2*x + rng.normal(0, 2, 50)
22
+ ax.stx_scatter(x, y, label='Data')
23
+ ax.set_xyt("X", "Y", "stx_scatter")
24
+ if hasattr(ax, 'legend') and ax.get_legend_handles_labels()[0]:
25
+ ax.legend()
26
+ return fig, ax
27
+
28
+
29
+ # EOF
@@ -0,0 +1,29 @@
1
+ #!/usr/bin/env python3
2
+ # -*- coding: utf-8 -*-
3
+ # File: plot_stx_shaded_line.py - stx_shaded_line demo
4
+
5
+ """stx_shaded_line: line with shading."""
6
+
7
+ import numpy as np
8
+
9
+
10
+ def plot_stx_shaded_line(plt, rng, ax=None):
11
+ """stx_shaded_line - line with shading.
12
+
13
+ Demonstrates: ax.stx_shaded_line()
14
+ """
15
+ if ax is None:
16
+ fig, ax = plt.subplots()
17
+ else:
18
+ fig = ax.get_figure() if hasattr(ax, "get_figure") else ax._fig_scitex
19
+
20
+ x = np.linspace(0, 10, 100)
21
+ y = np.sin(x)
22
+ ax.stx_shaded_line(x, y, y - 0.2, y + 0.2, label='Shaded')
23
+ ax.set_xyt("X", "Y", "stx_shaded_line")
24
+ if hasattr(ax, 'legend') and ax.get_legend_handles_labels()[0]:
25
+ ax.legend()
26
+ return fig, ax
27
+
28
+
29
+ # EOF
@@ -0,0 +1,28 @@
1
+ #!/usr/bin/env python3
2
+ # -*- coding: utf-8 -*-
3
+ # File: plot_stx_violin.py - stx_violin demo
4
+
5
+ """stx_violin: list of arrays."""
6
+
7
+ import numpy as np
8
+
9
+
10
+ def plot_stx_violin(plt, rng, ax=None):
11
+ """stx_violin - list of arrays.
12
+
13
+ Demonstrates: ax.stx_violin()
14
+ """
15
+ if ax is None:
16
+ fig, ax = plt.subplots()
17
+ else:
18
+ fig = ax.get_figure() if hasattr(ax, "get_figure") else ax._fig_scitex
19
+
20
+ data = [rng.normal(i, 0.5 + i*0.2, 100) for i in range(4)]
21
+ ax.stx_violin(data, labels=['A', 'B', 'C', 'D'])
22
+ ax.set_xyt("X", "Y", "stx_violin")
23
+ if hasattr(ax, 'legend') and ax.get_legend_handles_labels()[0]:
24
+ ax.legend()
25
+ return fig, ax
26
+
27
+
28
+ # EOF
@@ -0,0 +1,28 @@
1
+ #!/usr/bin/env python3
2
+ # -*- coding: utf-8 -*-
3
+ # File: plot_stx_violinplot.py - stx_violinplot demo
4
+
5
+ """stx_violinplot: matplotlib violinplot."""
6
+
7
+ import numpy as np
8
+
9
+
10
+ def plot_stx_violinplot(plt, rng, ax=None):
11
+ """stx_violinplot - matplotlib violinplot.
12
+
13
+ Demonstrates: ax.stx_violinplot()
14
+ """
15
+ if ax is None:
16
+ fig, ax = plt.subplots()
17
+ else:
18
+ fig = ax.get_figure() if hasattr(ax, "get_figure") else ax._fig_scitex
19
+
20
+ data = [rng.normal(i, 1, 100) for i in range(4)]
21
+ ax.stx_violinplot(data)
22
+ ax.set_xyt("X", "Y", "stx_violinplot")
23
+ if hasattr(ax, 'legend') and ax.get_legend_handles_labels()[0]:
24
+ ax.legend()
25
+ return fig, ax
26
+
27
+
28
+ # EOF
scitex/fig/__init__.py ADDED
@@ -0,0 +1,352 @@
1
+ #!/usr/bin/env python3
2
+ # -*- coding: utf-8 -*-
3
+ # Timestamp: 2025-12-08
4
+ # File: ./src/scitex/vis/__init__.py
5
+ """
6
+ SciTeX Visualization Module (scitex.fig)
7
+
8
+ Canvas-based composition of publication-quality figures.
9
+
10
+ Terminology:
11
+ - Canvas: A paper figure workspace (e.g., "Figure 1" in publication)
12
+ - Panel: A single component on canvas (stx.plt output or image)
13
+ - Figure: Reserved for matplotlib's fig object (see scitex.plt)
14
+
15
+ Quick Start:
16
+ -----------
17
+ >>> import scitex as stx
18
+ >>>
19
+ >>> # Create canvas and add panels
20
+ >>> stx.vis.create_canvas("/output", "fig1")
21
+ >>> stx.vis.add_panel("/output", "fig1", "panel_a", source="plot.png",
22
+ ... position=(10, 10), size=(80, 60), label="A")
23
+ >>>
24
+ >>> # Save with stx.io (auto-exports PNG/PDF/SVG)
25
+ >>> canvas = stx.io.load("/output/fig1.canvas")
26
+ >>> stx.io.save(canvas, "/output/fig1_copy.canvas")
27
+
28
+ Directory Structure:
29
+ -------------------
30
+ {parent_dir}/{canvas_name}.canvas/
31
+ ├── canvas.json # Layout, panels, composition
32
+ ├── panels/ # Panel directories
33
+ └── exports/ # canvas.png, canvas.pdf, canvas.svg
34
+ """
35
+
36
+ # Submodules for advanced use
37
+ from . import io
38
+ from . import model
39
+ from . import backend
40
+ from . import utils
41
+ from . import editor
42
+
43
+ # Canvas class
44
+ from .canvas import Canvas
45
+
46
+ # =============================================================================
47
+ # Primary API (minimal, reusable, flexible)
48
+ # =============================================================================
49
+
50
+ # Canvas operations
51
+ from .io import (
52
+ ensure_canvas_directory as create_canvas,
53
+ get_canvas_directory_path as get_canvas_path,
54
+ canvas_directory_exists as canvas_exists,
55
+ list_canvas_directories as list_canvases,
56
+ delete_canvas_directory as delete_canvas,
57
+ )
58
+
59
+ # Panel operations
60
+ from .io import (
61
+ add_panel_from_scitex,
62
+ add_panel_from_image,
63
+ update_panel,
64
+ remove_panel,
65
+ list_panels,
66
+ )
67
+
68
+ # Export (usually handled by stx.io.save, but available for explicit use)
69
+ from .io import export_canvas_to_file as export_canvas
70
+
71
+ # Data integrity
72
+ from .io import verify_all_data_hashes as verify_data
73
+
74
+ # Editor
75
+ from .editor import edit
76
+
77
+
78
+ # =============================================================================
79
+ # Convenience wrapper for add_panel
80
+ # =============================================================================
81
+ def add_panel(
82
+ parent_dir,
83
+ canvas_name,
84
+ panel_name,
85
+ source,
86
+ position=(0, 0),
87
+ size=(50, 50),
88
+ label="",
89
+ bundle=False,
90
+ **kwargs,
91
+ ):
92
+ """
93
+ Add a panel to canvas (auto-detects scitex vs image type).
94
+
95
+ Parameters
96
+ ----------
97
+ parent_dir : str or Path
98
+ Parent directory containing canvas
99
+ canvas_name : str
100
+ Canvas name
101
+ panel_name : str
102
+ Name for the panel
103
+ source : str or Path
104
+ Source file (PNG, JPG, SVG)
105
+ position : tuple
106
+ (x_mm, y_mm) position on canvas
107
+ size : tuple
108
+ (width_mm, height_mm) panel size
109
+ label : str
110
+ Panel label (A, B, C...)
111
+ bundle : bool
112
+ If True, copy files. If False (default), use symlinks.
113
+ **kwargs
114
+ Additional panel properties (rotation_deg, opacity, flip_h, etc.)
115
+ """
116
+ from pathlib import Path
117
+
118
+ source = Path(source)
119
+ panel_properties = {
120
+ "position": {"x_mm": position[0], "y_mm": position[1]},
121
+ "size": {"width_mm": size[0], "height_mm": size[1]},
122
+ **kwargs,
123
+ }
124
+ if label:
125
+ panel_properties["label"] = {"text": label, "position": "top-left"}
126
+
127
+ # Check if scitex output (has .json/.csv siblings)
128
+ json_sibling = source.parent / f"{source.stem}.json"
129
+ if json_sibling.exists():
130
+ return add_panel_from_scitex(
131
+ project_dir=parent_dir,
132
+ canvas_name=canvas_name,
133
+ panel_name=panel_name,
134
+ source_png=source,
135
+ panel_properties=panel_properties,
136
+ bundle=bundle,
137
+ )
138
+ else:
139
+ return add_panel_from_image(
140
+ project_dir=parent_dir,
141
+ canvas_name=canvas_name,
142
+ panel_name=panel_name,
143
+ source_image=source,
144
+ panel_properties=panel_properties,
145
+ bundle=bundle,
146
+ )
147
+
148
+
149
+ # =============================================================================
150
+ # .figz Bundle Support
151
+ # =============================================================================
152
+
153
+ def save_figz(
154
+ panels,
155
+ path,
156
+ spec=None,
157
+ as_zip=None,
158
+ ):
159
+ """
160
+ Save panels as a .figz publication figure bundle.
161
+
162
+ Parameters
163
+ ----------
164
+ panels : dict
165
+ Dictionary mapping panel IDs to .pltz bundle paths or data.
166
+ Example: {"A": "timecourse.pltz.d", "B": "barplot.pltz.d"}
167
+ path : str or Path
168
+ Output path (e.g., "Figure1.figz" or "Figure1.figz.d").
169
+ - Path ending with ".figz" creates ZIP archive (default behavior)
170
+ - Path ending with ".figz.d" creates directory bundle
171
+ spec : dict, optional
172
+ Figure specification. Auto-generated if None.
173
+ as_zip : bool, optional
174
+ If True, save as ZIP archive. If False, save as directory.
175
+ Default: auto-detect from path (ZIP for .figz, directory for .figz.d).
176
+
177
+ Returns
178
+ -------
179
+ Path
180
+ Path to saved bundle.
181
+
182
+ Examples
183
+ --------
184
+ >>> import scitex.fig as sfig
185
+ >>> panels = {
186
+ ... "A": "timecourse.pltz.d",
187
+ ... "B": "barplot.pltz.d"
188
+ ... }
189
+ >>> sfig.save_figz(panels, "Figure1.figz") # Creates ZIP
190
+ >>> sfig.save_figz(panels, "Figure1.figz.d") # Creates directory
191
+ """
192
+ from pathlib import Path
193
+ import shutil
194
+ from scitex.io._bundle import save_bundle, BundleType
195
+
196
+ p = Path(path)
197
+ spath = str(path)
198
+
199
+ # Auto-detect as_zip from path suffix if not specified
200
+ if as_zip is None:
201
+ as_zip = not spath.endswith(".d")
202
+
203
+ # Auto-generate spec if not provided
204
+ if spec is None:
205
+ spec = _generate_figure_spec(panels)
206
+
207
+ # Build bundle data - pass source paths directly for file copying
208
+ bundle_data = {
209
+ 'spec': spec,
210
+ 'plots': {},
211
+ }
212
+
213
+ # Pass source paths directly (not loaded data) to preserve all files
214
+ for panel_id, pltz_source in panels.items():
215
+ pltz_path = Path(pltz_source)
216
+ if pltz_path.exists():
217
+ # Store source path for direct copying
218
+ bundle_data['plots'][panel_id] = str(pltz_path)
219
+
220
+ return save_bundle(bundle_data, p, bundle_type=BundleType.FIGZ, as_zip=as_zip)
221
+
222
+
223
+ def load_figz(path):
224
+ """
225
+ Load a .figz bundle.
226
+
227
+ Parameters
228
+ ----------
229
+ path : str or Path
230
+ Path to .figz bundle (directory or ZIP).
231
+
232
+ Returns
233
+ -------
234
+ dict
235
+ Figure data with:
236
+ - 'spec': Figure specification
237
+ - 'panels': Dict mapping panel IDs to {'spec': ..., 'data': ...}
238
+
239
+ Examples
240
+ --------
241
+ >>> figure = scitex.fig.load_figz("Figure1.figz.d")
242
+ >>> print(figure['spec']['figure']['title'])
243
+ >>> panel_a = figure['panels']['A']
244
+ >>> print(panel_a['spec'], panel_a['data'])
245
+ """
246
+ from scitex.io._bundle import load_bundle
247
+
248
+ bundle = load_bundle(path)
249
+
250
+ if bundle['type'] != 'figz':
251
+ raise ValueError(f"Not a .figz bundle: {path}")
252
+
253
+ result = {
254
+ 'spec': bundle.get('spec', {}),
255
+ 'panels': {},
256
+ }
257
+
258
+ # Return spec and data for each panel (reconstruction is optional)
259
+ for panel_id, plot_bundle in bundle.get('plots', {}).items():
260
+ result['panels'][panel_id] = {
261
+ 'spec': plot_bundle.get('spec', {}),
262
+ 'data': plot_bundle.get('data'),
263
+ }
264
+
265
+ return result
266
+
267
+
268
+ def _generate_figure_spec(panels):
269
+ """Generate figure.json spec from panels."""
270
+ from pathlib import Path
271
+
272
+ spec = {
273
+ 'schema': {'name': 'scitex.fig.figure', 'version': '1.0.0'},
274
+ 'figure': {
275
+ 'id': 'figure',
276
+ 'title': '',
277
+ 'caption': '',
278
+ 'styles': {
279
+ 'size': {'width_mm': 180, 'height_mm': 120},
280
+ 'background': '#ffffff',
281
+ },
282
+ },
283
+ 'panels': [],
284
+ }
285
+
286
+ # Auto-layout panels
287
+ panel_ids = sorted(panels.keys())
288
+ n_panels = len(panel_ids)
289
+
290
+ if n_panels == 0:
291
+ return spec
292
+
293
+ # Simple grid layout
294
+ cols = min(n_panels, 2)
295
+ rows = (n_panels + cols - 1) // cols
296
+
297
+ panel_w = 80
298
+ panel_h = 50
299
+ margin = 5
300
+
301
+ for i, panel_id in enumerate(panel_ids):
302
+ row = i // cols
303
+ col = i % cols
304
+
305
+ x = margin + col * (panel_w + margin)
306
+ y = margin + row * (panel_h + margin)
307
+
308
+ # Note: save_bundle uses panel_id for the directory name (e.g., A.pltz.d)
309
+ spec['panels'].append({
310
+ 'id': panel_id,
311
+ 'label': panel_id,
312
+ 'caption': '',
313
+ 'plot': f"{panel_id}.pltz.d",
314
+ 'position': {'x_mm': x, 'y_mm': y},
315
+ 'size': {'width_mm': panel_w, 'height_mm': panel_h},
316
+ })
317
+
318
+ return spec
319
+
320
+
321
+ __all__ = [
322
+ # Canvas class
323
+ "Canvas",
324
+ # Submodules (advanced)
325
+ "io",
326
+ "model",
327
+ "backend",
328
+ "utils",
329
+ "editor",
330
+ # Canvas operations
331
+ "create_canvas",
332
+ "get_canvas_path",
333
+ "canvas_exists",
334
+ "list_canvases",
335
+ "delete_canvas",
336
+ # Panel operations
337
+ "add_panel",
338
+ "update_panel",
339
+ "remove_panel",
340
+ "list_panels",
341
+ # Export
342
+ "export_canvas",
343
+ # Data integrity
344
+ "verify_data",
345
+ # Editor
346
+ "edit",
347
+ # .figz bundle
348
+ "save_figz",
349
+ "load_figz",
350
+ ]
351
+
352
+ # EOF
@@ -161,7 +161,7 @@ def validate_figure_json(fig_json: Dict[str, Any]) -> bool:
161
161
 
162
162
  Examples
163
163
  --------
164
- >>> from scitex.vis.backend import validate_figure_json
164
+ >>> from scitex.fig.backend import validate_figure_json
165
165
  >>> fig_json = {"width_mm": 180, "height_mm": 120, "axes": []}
166
166
  >>> validate_figure_json(fig_json)
167
167
  True
@@ -3,7 +3,7 @@
3
3
  # Timestamp: 2025-12-08
4
4
  # File: ./src/scitex/vis/canvas.py
5
5
  """
6
- Canvas class for scitex.vis.
6
+ Canvas class for scitex.fig.
7
7
 
8
8
  Provides object-oriented interface to canvas operations.
9
9
  """
@@ -3,6 +3,8 @@
3
3
  # File: ./src/scitex/vis/editor/_defaults.py
4
4
  """Default style settings for SciTeX visual editor."""
5
5
 
6
+ from scitex.plt.styles import get_default_dpi, get_preview_dpi
7
+
6
8
 
7
9
  def get_scitex_defaults():
8
10
  """
@@ -36,7 +38,7 @@ def get_scitex_defaults():
36
38
  "grid_linewidth": 0.6,
37
39
  "grid_alpha": 0.3,
38
40
  # Figure settings
39
- "dpi": 300, # Default DPI
41
+ "dpi": get_default_dpi(), # From SCITEX_STYLE.yaml
40
42
  "fig_size": [3.15, 2.68], # Default figure size in inches
41
43
  # Colors (SciTeX defaults)
42
44
  "facecolor": "#ffffff", # White background
@@ -126,13 +128,23 @@ def extract_defaults_from_metadata(metadata):
126
128
  if "n_ticks" in style_mm:
127
129
  defaults["n_ticks"] = style_mm["n_ticks"]
128
130
 
129
- # Dimensions from metadata
131
+ # Dimensions from metadata (support both old and new formats)
130
132
  dimensions = metadata.get("dimensions", {})
131
133
  if "dpi" in dimensions:
132
134
  defaults["dpi"] = dimensions["dpi"]
133
135
  if "figure_size_inch" in dimensions:
134
136
  defaults["fig_size"] = dimensions["figure_size_inch"]
135
137
 
138
+ # New format: size.width_mm, size.height_mm, size.dpi
139
+ size = metadata.get("size", {})
140
+ if "dpi" in size:
141
+ defaults["dpi"] = size["dpi"]
142
+ if "width_mm" in size and "height_mm" in size:
143
+ # Convert mm to inches
144
+ width_inch = size["width_mm"] / 25.4
145
+ height_inch = size["height_mm"] / 25.4
146
+ defaults["fig_size"] = [width_inch, height_inch]
147
+
136
148
  # Axis labels from metadata
137
149
  if "xlabel" in metadata:
138
150
  defaults["xlabel"] = metadata["xlabel"]
@@ -177,20 +189,73 @@ def extract_defaults_from_metadata(metadata):
177
189
  defaults["title"] = ax["title"]
178
190
  if "grid" in ax:
179
191
  defaults["grid"] = ax["grid"]
192
+ # Extract axis limits from list format
193
+ if "xlim" in ax:
194
+ defaults["xlim"] = ax["xlim"]
195
+ if "ylim" in ax:
196
+ defaults["ylim"] = ax["ylim"]
180
197
 
181
- # Extract traces information
198
+ # Extract traces information - check multiple possible locations
182
199
  traces = metadata.get("traces", [])
200
+
201
+ # Also check axes[].lines (pltz bundle format)
202
+ if not traces and isinstance(axes, list) and len(axes) > 0:
203
+ ax = axes[0]
204
+ lines = ax.get("lines", [])
205
+ if lines:
206
+ traces = lines
207
+
208
+ # Also check hit_regions.color_map for trace info
209
+ if not traces:
210
+ hit_regions = metadata.get("hit_regions", {})
211
+ color_map = hit_regions.get("color_map", {})
212
+ if color_map:
213
+ traces = []
214
+ for trace_id, trace_info in color_map.items():
215
+ traces.append({
216
+ "id": trace_id,
217
+ "label": trace_info.get("label", f"Trace {trace_id}"),
218
+ "type": trace_info.get("type", "line"),
219
+ })
220
+
183
221
  if traces:
184
222
  defaults["traces"] = traces
185
223
 
186
- # Extract legend information
224
+ # Extract legend information from multiple possible locations
187
225
  legend = metadata.get("legend", {})
226
+
227
+ # Also check selectable_regions.axes[0].legend (pltz bundle format)
228
+ if not legend:
229
+ selectable = metadata.get("selectable_regions", {})
230
+ sel_axes = selectable.get("axes", [])
231
+ if sel_axes and len(sel_axes) > 0:
232
+ legend = sel_axes[0].get("legend", {})
233
+
188
234
  if legend:
189
235
  defaults["legend_visible"] = legend.get("visible", True)
190
236
  defaults["legend_frameon"] = legend.get("frameon", False)
191
- loc = legend.get("loc", "best")
237
+ # Support both old format (loc) and new format (location)
238
+ loc = legend.get("location") or legend.get("loc", "best")
192
239
  # Convert numeric legend loc to string (matplotlib accepts both but GUI needs string)
193
240
  defaults["legend_loc"] = _normalize_legend_loc(loc)
241
+ # Extract fontsize if present
242
+ if "fontsize" in legend:
243
+ defaults["legend_fontsize"] = legend["fontsize"]
244
+ # Extract ncols if present
245
+ if "ncols" in legend:
246
+ defaults["legend_ncols"] = legend["ncols"]
247
+ # Extract title if present
248
+ if "title" in legend:
249
+ defaults["legend_title"] = legend["title"]
250
+
251
+ # Extract legend entries if present
252
+ entries = legend.get("entries", [])
253
+ if entries and not traces:
254
+ # Use legend entries as trace labels
255
+ defaults["traces"] = [
256
+ {"label": e.get("text", f"Trace {i}")}
257
+ for i, e in enumerate(entries)
258
+ ]
194
259
 
195
260
  return defaults
196
261