numdaplot 0.1.0__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 (474) hide show
  1. numdaplot/__init__.py +506 -0
  2. numdaplot/arrays/__init__.py +5 -0
  3. numdaplot/arrays/array.py +92 -0
  4. numdaplot/arrays/array_arithmetic.py +404 -0
  5. numdaplot/arrays/array_calculation.py +143 -0
  6. numdaplot/arrays/array_conversion.py +150 -0
  7. numdaplot/arrays/array_creation.py +371 -0
  8. numdaplot/arrays/array_data.py +281 -0
  9. numdaplot/arrays/array_layout.py +179 -0
  10. numdaplot/arrays/array_logic.py +227 -0
  11. numdaplot/arrays/array_reflected_arithmetic.py +334 -0
  12. numdaplot/arrays/array_refusals.py +339 -0
  13. numdaplot/arrays/array_selection.py +195 -0
  14. numdaplot/arrays/array_sorting.py +59 -0
  15. numdaplot/arrays/axis_number.py +58 -0
  16. numdaplot/arrays/calculation/__init__.py +5 -0
  17. numdaplot/arrays/calculation/counting_statistics.py +325 -0
  18. numdaplot/arrays/calculation/location_statistics.py +268 -0
  19. numdaplot/arrays/calculation/math_function_values.py +183 -0
  20. numdaplot/arrays/calculation/statistic_values.py +209 -0
  21. numdaplot/arrays/calculation/time_function_values.py +419 -0
  22. numdaplot/arrays/conversion/__init__.py +5 -0
  23. numdaplot/arrays/conversion/array_text.py +62 -0
  24. numdaplot/arrays/conversion/equality_check.py +72 -0
  25. numdaplot/arrays/conversion/python_values.py +70 -0
  26. numdaplot/arrays/conversion/time_text.py +290 -0
  27. numdaplot/arrays/creation/__init__.py +5 -0
  28. numdaplot/arrays/creation/date_parts.py +89 -0
  29. numdaplot/arrays/creation/date_parts_values.py +437 -0
  30. numdaplot/arrays/creation/distribution.py +54 -0
  31. numdaplot/arrays/creation/filled_values.py +58 -0
  32. numdaplot/arrays/creation/list_conversion.py +311 -0
  33. numdaplot/arrays/creation/list_shape.py +97 -0
  34. numdaplot/arrays/creation/normal.py +65 -0
  35. numdaplot/arrays/creation/numpy_conversion.py +149 -0
  36. numdaplot/arrays/creation/random_integers.py +104 -0
  37. numdaplot/arrays/creation/random_values.py +97 -0
  38. numdaplot/arrays/creation/range_values.py +73 -0
  39. numdaplot/arrays/creation/spacing.py +84 -0
  40. numdaplot/arrays/creation/spacing_values.py +63 -0
  41. numdaplot/arrays/creation/uniform.py +63 -0
  42. numdaplot/arrays/equality.py +68 -0
  43. numdaplot/arrays/layout/__init__.py +5 -0
  44. numdaplot/arrays/layout/sorting_values.py +113 -0
  45. numdaplot/arrays/layout/unique_values.py +49 -0
  46. numdaplot/arrays/mapping/__init__.py +5 -0
  47. numdaplot/arrays/mapping/mapped_values.py +286 -0
  48. numdaplot/arrays/mapping/unmatched.py +50 -0
  49. numdaplot/arrays/mapping/value_change.py +55 -0
  50. numdaplot/arrays/mapping/value_mapping.py +161 -0
  51. numdaplot/arrays/math_functions/__init__.py +5 -0
  52. numdaplot/arrays/math_functions/absolute.py +27 -0
  53. numdaplot/arrays/math_functions/cosine.py +28 -0
  54. numdaplot/arrays/math_functions/exponential.py +27 -0
  55. numdaplot/arrays/math_functions/logarithm.py +72 -0
  56. numdaplot/arrays/math_functions/math_function.py +58 -0
  57. numdaplot/arrays/math_functions/round.py +58 -0
  58. numdaplot/arrays/math_functions/sine.py +28 -0
  59. numdaplot/arrays/math_functions/square_root.py +27 -0
  60. numdaplot/arrays/operations/__init__.py +5 -0
  61. numdaplot/arrays/operations/boolean_operands.py +48 -0
  62. numdaplot/arrays/operations/combination.py +157 -0
  63. numdaplot/arrays/operations/float_errors.py +170 -0
  64. numdaplot/arrays/operations/integer_bounds.py +175 -0
  65. numdaplot/arrays/operations/integer_rules.py +397 -0
  66. numdaplot/arrays/operations/operand.py +139 -0
  67. numdaplot/arrays/operations/time_arithmetic.py +479 -0
  68. numdaplot/arrays/operations/time_bounds.py +286 -0
  69. numdaplot/arrays/operations/time_result_bounds.py +397 -0
  70. numdaplot/arrays/operations/transformation.py +54 -0
  71. numdaplot/arrays/operations/type_requirements.py +94 -0
  72. numdaplot/arrays/replacement.py +66 -0
  73. numdaplot/arrays/selection/__init__.py +5 -0
  74. numdaplot/arrays/selection/comparison_masks.py +131 -0
  75. numdaplot/arrays/selection/membership_masks.py +118 -0
  76. numdaplot/arrays/selection/missing_mask.py +50 -0
  77. numdaplot/arrays/selection/region_index.py +178 -0
  78. numdaplot/arrays/selection/replaced_values.py +120 -0
  79. numdaplot/arrays/selection/rule_mask.py +83 -0
  80. numdaplot/arrays/selection/time_reference.py +172 -0
  81. numdaplot/arrays/shape.py +74 -0
  82. numdaplot/arrays/type_match.py +51 -0
  83. numdaplot/data_types/__init__.py +5 -0
  84. numdaplot/data_types/library.py +57 -0
  85. numdaplot/data_types/numpy_mapping.py +207 -0
  86. numdaplot/data_types/pandas_mapping.py +114 -0
  87. numdaplot/data_types/time_of_day.py +292 -0
  88. numdaplot/data_types/type.py +224 -0
  89. numdaplot/data_types/value_family.py +149 -0
  90. numdaplot/data_types/value_type.py +147 -0
  91. numdaplot/dates/__init__.py +5 -0
  92. numdaplot/dates/custom_date_format.py +83 -0
  93. numdaplot/dates/date_format.py +120 -0
  94. numdaplot/dates/date_part.py +59 -0
  95. numdaplot/dates/date_part_unit.py +153 -0
  96. numdaplot/dates/date_period.py +57 -0
  97. numdaplot/dates/duration_in.py +58 -0
  98. numdaplot/dates/duration_unit.py +90 -0
  99. numdaplot/dates/period_unit.py +101 -0
  100. numdaplot/dates/time_function.py +56 -0
  101. numdaplot/dates/time_zone.py +68 -0
  102. numdaplot/dates/time_zone_change.py +71 -0
  103. numdaplot/dates/time_zone_mode.py +81 -0
  104. numdaplot/dates/to_duration.py +58 -0
  105. numdaplot/errors/__init__.py +7 -0
  106. numdaplot/errors/broadcast_warning.py +36 -0
  107. numdaplot/errors/calculation_warning.py +35 -0
  108. numdaplot/errors/cell_out_of_range_error.py +77 -0
  109. numdaplot/errors/column_not_found_error.py +64 -0
  110. numdaplot/errors/conflicting_settings_error.py +60 -0
  111. numdaplot/errors/dimension_error.py +62 -0
  112. numdaplot/errors/display_warning.py +32 -0
  113. numdaplot/errors/duplicate_column_error.py +82 -0
  114. numdaplot/errors/duplicate_label_error.py +55 -0
  115. numdaplot/errors/duplicate_statistic_error.py +55 -0
  116. numdaplot/errors/duplicate_value_error.py +54 -0
  117. numdaplot/errors/empty_array_error.py +55 -0
  118. numdaplot/errors/empty_list_error.py +52 -0
  119. numdaplot/errors/empty_region_error.py +34 -0
  120. numdaplot/errors/empty_text_error.py +34 -0
  121. numdaplot/errors/empty_total_error.py +62 -0
  122. numdaplot/errors/empty_values_error.py +34 -0
  123. numdaplot/errors/file_access_error.py +70 -0
  124. numdaplot/errors/file_exists_error.py +62 -0
  125. numdaplot/errors/file_not_found_error.py +56 -0
  126. numdaplot/errors/incompatible_charts_error.py +80 -0
  127. numdaplot/errors/incompatible_types_error.py +104 -0
  128. numdaplot/errors/integer_overflow_error.py +61 -0
  129. numdaplot/errors/invalid_base_error.py +52 -0
  130. numdaplot/errors/invalid_bin_width_error.py +66 -0
  131. numdaplot/errors/invalid_bounds_error.py +58 -0
  132. numdaplot/errors/invalid_chart_data_error.py +81 -0
  133. numdaplot/errors/invalid_color_count_error.py +63 -0
  134. numdaplot/errors/invalid_color_error.py +51 -0
  135. numdaplot/errors/invalid_column_name_error.py +52 -0
  136. numdaplot/errors/invalid_conversion_error.py +119 -0
  137. numdaplot/errors/invalid_count_error.py +61 -0
  138. numdaplot/errors/invalid_date_format_error.py +51 -0
  139. numdaplot/errors/invalid_deviation_error.py +52 -0
  140. numdaplot/errors/invalid_fraction_error.py +51 -0
  141. numdaplot/errors/invalid_label_count_error.py +61 -0
  142. numdaplot/errors/invalid_limits_error.py +111 -0
  143. numdaplot/errors/invalid_opacity_error.py +52 -0
  144. numdaplot/errors/invalid_point_size_error.py +52 -0
  145. numdaplot/errors/invalid_position_error.py +106 -0
  146. numdaplot/errors/invalid_resolution_error.py +51 -0
  147. numdaplot/errors/invalid_rotation_error.py +53 -0
  148. numdaplot/errors/invalid_seed_error.py +53 -0
  149. numdaplot/errors/invalid_separator_error.py +52 -0
  150. numdaplot/errors/invalid_shape_error.py +52 -0
  151. numdaplot/errors/invalid_sheet_name_error.py +54 -0
  152. numdaplot/errors/invalid_size_error.py +58 -0
  153. numdaplot/errors/invalid_step_error.py +77 -0
  154. numdaplot/errors/invalid_suffixes_error.py +61 -0
  155. numdaplot/errors/invalid_time_zone_change_error.py +63 -0
  156. numdaplot/errors/invalid_type_error.py +79 -0
  157. numdaplot/errors/irregular_list_error.py +36 -0
  158. numdaplot/errors/join_relation_error.py +183 -0
  159. numdaplot/errors/missing_dependency_error.py +58 -0
  160. numdaplot/errors/missing_type_error.py +36 -0
  161. numdaplot/errors/missing_value_error.py +62 -0
  162. numdaplot/errors/not_single_value_error.py +53 -0
  163. numdaplot/errors/numdaplot_error.py +25 -0
  164. numdaplot/errors/numdaplot_warning.py +34 -0
  165. numdaplot/errors/occupied_cell_error.py +63 -0
  166. numdaplot/errors/out_of_domain_error.py +70 -0
  167. numdaplot/errors/readability_warning.py +35 -0
  168. numdaplot/errors/refused_operation_error.py +64 -0
  169. numdaplot/errors/refused_setting_error.py +60 -0
  170. numdaplot/errors/rejected_dates.py +60 -0
  171. numdaplot/errors/repeated_key.py +36 -0
  172. numdaplot/errors/shape_mismatch_error.py +67 -0
  173. numdaplot/errors/time_overflow_error.py +131 -0
  174. numdaplot/errors/time_zone_mismatch_error.py +83 -0
  175. numdaplot/errors/unknown_time_zone_error.py +51 -0
  176. numdaplot/errors/unmatched_value_error.py +81 -0
  177. numdaplot/errors/unsupported_image_format_error.py +56 -0
  178. numdaplot/errors/unsupported_index_error.py +38 -0
  179. numdaplot/errors/unsupported_missing_error.py +129 -0
  180. numdaplot/errors/unsupported_type_error.py +62 -0
  181. numdaplot/errors/value_conversion_error.py +215 -0
  182. numdaplot/ordering/__init__.py +5 -0
  183. numdaplot/ordering/missing_position.py +46 -0
  184. numdaplot/ordering/order.py +46 -0
  185. numdaplot/package_version.py +36 -0
  186. numdaplot/plots/__init__.py +5 -0
  187. numdaplot/plots/chart_layer.py +47 -0
  188. numdaplot/plots/charts/__init__.py +5 -0
  189. numdaplot/plots/charts/bar_chart.py +98 -0
  190. numdaplot/plots/charts/bar_layout.py +58 -0
  191. numdaplot/plots/charts/bin_count.py +61 -0
  192. numdaplot/plots/charts/bin_width.py +78 -0
  193. numdaplot/plots/charts/box_chart.py +97 -0
  194. numdaplot/plots/charts/cell_values.py +61 -0
  195. numdaplot/plots/charts/chart.py +59 -0
  196. numdaplot/plots/charts/chart_settings.py +105 -0
  197. numdaplot/plots/charts/color_scale.py +147 -0
  198. numdaplot/plots/charts/heatmap_chart.py +92 -0
  199. numdaplot/plots/charts/histogram_chart.py +93 -0
  200. numdaplot/plots/charts/line_chart.py +100 -0
  201. numdaplot/plots/charts/line_type.py +75 -0
  202. numdaplot/plots/charts/marker_shape.py +113 -0
  203. numdaplot/plots/charts/missing_chart.py +60 -0
  204. numdaplot/plots/charts/missing_map_chart.py +27 -0
  205. numdaplot/plots/charts/orientation.py +58 -0
  206. numdaplot/plots/charts/outliers.py +49 -0
  207. numdaplot/plots/charts/percentages.py +55 -0
  208. numdaplot/plots/charts/pie_chart.py +87 -0
  209. numdaplot/plots/charts/scatter_chart.py +159 -0
  210. numdaplot/plots/charts/value_axis.py +66 -0
  211. numdaplot/plots/data/__init__.py +5 -0
  212. numdaplot/plots/data/array_values.py +128 -0
  213. numdaplot/plots/data/chart_data.py +143 -0
  214. numdaplot/plots/data/chart_values.py +109 -0
  215. numdaplot/plots/data/column_reading.py +468 -0
  216. numdaplot/plots/data/heatmap_values.py +63 -0
  217. numdaplot/plots/data/missing_cells.py +165 -0
  218. numdaplot/plots/data/pie_values.py +215 -0
  219. numdaplot/plots/data/point_values.py +249 -0
  220. numdaplot/plots/data/position_kind.py +83 -0
  221. numdaplot/plots/data/renamed_layers.py +340 -0
  222. numdaplot/plots/data/sample_values.py +160 -0
  223. numdaplot/plots/data/shown_columns.py +248 -0
  224. numdaplot/plots/data/table_values.py +256 -0
  225. numdaplot/plots/data/unique_labels.py +45 -0
  226. numdaplot/plots/drawing/__init__.py +5 -0
  227. numdaplot/plots/drawing/bar_drawing.py +316 -0
  228. numdaplot/plots/drawing/box_drawing.py +344 -0
  229. numdaplot/plots/drawing/cell_merging.py +237 -0
  230. numdaplot/plots/drawing/chart_texts.py +124 -0
  231. numdaplot/plots/drawing/color_bar.py +57 -0
  232. numdaplot/plots/drawing/color_scale_values.py +120 -0
  233. numdaplot/plots/drawing/default_labels.py +41 -0
  234. numdaplot/plots/drawing/drawn_chart.py +50 -0
  235. numdaplot/plots/drawing/grid_axes.py +75 -0
  236. numdaplot/plots/drawing/heatmap_drawing.py +313 -0
  237. numdaplot/plots/drawing/histogram_drawing.py +350 -0
  238. numdaplot/plots/drawing/label_room.py +344 -0
  239. numdaplot/plots/drawing/label_thinning.py +216 -0
  240. numdaplot/plots/drawing/layer_alignment.py +319 -0
  241. numdaplot/plots/drawing/layer_colors.py +123 -0
  242. numdaplot/plots/drawing/line_drawing.py +85 -0
  243. numdaplot/plots/drawing/marker_codes.py +20 -0
  244. numdaplot/plots/drawing/missing_drawing.py +360 -0
  245. numdaplot/plots/drawing/moment_period_formatter.py +253 -0
  246. numdaplot/plots/drawing/pie_drawing.py +185 -0
  247. numdaplot/plots/drawing/plot_axes.py +38 -0
  248. numdaplot/plots/drawing/plot_drawing.py +288 -0
  249. numdaplot/plots/drawing/plot_theme.py +45 -0
  250. numdaplot/plots/drawing/position_axis.py +278 -0
  251. numdaplot/plots/drawing/scatter_drawing.py +364 -0
  252. numdaplot/plots/drawing/series_colors.py +177 -0
  253. numdaplot/plots/drawing/size_inches.py +45 -0
  254. numdaplot/plots/drawing/style_drawing.py +410 -0
  255. numdaplot/plots/drawing/text_contrast.py +44 -0
  256. numdaplot/plots/drawing/tick_rotation.py +354 -0
  257. numdaplot/plots/drawing/time_axis.py +212 -0
  258. numdaplot/plots/drawing/whole_numbers.py +72 -0
  259. numdaplot/plots/figure/__init__.py +5 -0
  260. numdaplot/plots/figure/cell.py +95 -0
  261. numdaplot/plots/figure/figure.py +256 -0
  262. numdaplot/plots/figure/figure_drawing.py +99 -0
  263. numdaplot/plots/figure/figure_style.py +60 -0
  264. numdaplot/plots/figure/layout.py +71 -0
  265. numdaplot/plots/figure/placement.py +150 -0
  266. numdaplot/plots/layer_reading.py +166 -0
  267. numdaplot/plots/output/__init__.py +5 -0
  268. numdaplot/plots/output/image_saving.py +187 -0
  269. numdaplot/plots/output/plot_display.py +181 -0
  270. numdaplot/plots/output/shown_object.py +45 -0
  271. numdaplot/plots/overlay_checks.py +245 -0
  272. numdaplot/plots/plot.py +31 -0
  273. numdaplot/plots/plot_data.py +140 -0
  274. numdaplot/plots/plot_distribution_creation.py +237 -0
  275. numdaplot/plots/plot_output.py +124 -0
  276. numdaplot/plots/plot_overlays.py +273 -0
  277. numdaplot/plots/plot_overview_creation.py +195 -0
  278. numdaplot/plots/plot_series_creation.py +213 -0
  279. numdaplot/plots/style/__init__.py +5 -0
  280. numdaplot/plots/style/axis_settings.py +60 -0
  281. numdaplot/plots/style/color.py +168 -0
  282. numdaplot/plots/style/custom_color.py +65 -0
  283. numdaplot/plots/style/grid_lines.py +49 -0
  284. numdaplot/plots/style/image_options.py +71 -0
  285. numdaplot/plots/style/legend_position.py +149 -0
  286. numdaplot/plots/style/plot_style.py +136 -0
  287. numdaplot/plots/style/size.py +70 -0
  288. numdaplot/plots/style/size_unit.py +62 -0
  289. numdaplot/positions/__init__.py +5 -0
  290. numdaplot/positions/axis.py +54 -0
  291. numdaplot/positions/index.py +51 -0
  292. numdaplot/positions/range.py +90 -0
  293. numdaplot/positions/region.py +92 -0
  294. numdaplot/py.typed +0 -0
  295. numdaplot/ratios/__init__.py +5 -0
  296. numdaplot/ratios/fraction.py +40 -0
  297. numdaplot/ratios/measure.py +48 -0
  298. numdaplot/rules/__init__.py +5 -0
  299. numdaplot/rules/between.py +78 -0
  300. numdaplot/rules/bounds.py +83 -0
  301. numdaplot/rules/case.py +48 -0
  302. numdaplot/rules/contains.py +63 -0
  303. numdaplot/rules/equal.py +43 -0
  304. numdaplot/rules/greater.py +39 -0
  305. numdaplot/rules/greater_or_equal.py +38 -0
  306. numdaplot/rules/is_in.py +67 -0
  307. numdaplot/rules/is_missing.py +25 -0
  308. numdaplot/rules/is_present.py +25 -0
  309. numdaplot/rules/less.py +39 -0
  310. numdaplot/rules/less_or_equal.py +38 -0
  311. numdaplot/rules/not_equal.py +45 -0
  312. numdaplot/rules/rule.py +62 -0
  313. numdaplot/rules/rule_values.py +44 -0
  314. numdaplot/rules/value_rule.py +110 -0
  315. numdaplot/settings/__init__.py +5 -0
  316. numdaplot/settings/argument_types.py +327 -0
  317. numdaplot/settings/field_types.py +593 -0
  318. numdaplot/statistics/__init__.py +5 -0
  319. numdaplot/statistics/count.py +71 -0
  320. numdaplot/statistics/count_distinct.py +27 -0
  321. numdaplot/statistics/counted_missing.py +46 -0
  322. numdaplot/statistics/maximum.py +27 -0
  323. numdaplot/statistics/mean.py +27 -0
  324. numdaplot/statistics/median.py +27 -0
  325. numdaplot/statistics/minimum.py +27 -0
  326. numdaplot/statistics/most_frequent.py +27 -0
  327. numdaplot/statistics/most_frequent_count.py +27 -0
  328. numdaplot/statistics/quantile.py +61 -0
  329. numdaplot/statistics/standard_deviation.py +29 -0
  330. numdaplot/statistics/statistic.py +63 -0
  331. numdaplot/statistics/sum.py +27 -0
  332. numdaplot/tables/__init__.py +5 -0
  333. numdaplot/tables/aggregation/__init__.py +5 -0
  334. numdaplot/tables/aggregation/aggregated_frame.py +189 -0
  335. numdaplot/tables/aggregation/aggregation.py +97 -0
  336. numdaplot/tables/aggregation/calculation.py +123 -0
  337. numdaplot/tables/aggregation/result_column.py +108 -0
  338. numdaplot/tables/aggregation/row_groups.py +96 -0
  339. numdaplot/tables/aggregation/statistic_name.py +122 -0
  340. numdaplot/tables/columns/__init__.py +5 -0
  341. numdaplot/tables/columns/added_column.py +89 -0
  342. numdaplot/tables/columns/boolean_conversion.py +144 -0
  343. numdaplot/tables/columns/boolean_rule.py +59 -0
  344. numdaplot/tables/columns/bracket_end.py +50 -0
  345. numdaplot/tables/columns/bracket_names.py +346 -0
  346. numdaplot/tables/columns/bracketed_column.py +179 -0
  347. numdaplot/tables/columns/brackets.py +234 -0
  348. numdaplot/tables/columns/chosen_columns.py +55 -0
  349. numdaplot/tables/columns/column_choice.py +84 -0
  350. numdaplot/tables/columns/column_mode.py +64 -0
  351. numdaplot/tables/columns/column_names.py +186 -0
  352. numdaplot/tables/columns/conversion.py +103 -0
  353. numdaplot/tables/columns/converted_column.py +669 -0
  354. numdaplot/tables/columns/date_conversion.py +526 -0
  355. numdaplot/tables/columns/date_range.py +135 -0
  356. numdaplot/tables/columns/name_change.py +67 -0
  357. numdaplot/tables/columns/new_column.py +79 -0
  358. numdaplot/tables/columns/number_conversion.py +281 -0
  359. numdaplot/tables/columns/renamed_columns.py +60 -0
  360. numdaplot/tables/columns/renaming.py +81 -0
  361. numdaplot/tables/columns/text_conversion.py +70 -0
  362. numdaplot/tables/columns/time_conversion.py +313 -0
  363. numdaplot/tables/columns/time_zone_conversion.py +128 -0
  364. numdaplot/tables/conflict.py +68 -0
  365. numdaplot/tables/description/__init__.py +5 -0
  366. numdaplot/tables/description/described_frame.py +335 -0
  367. numdaplot/tables/description/description.py +155 -0
  368. numdaplot/tables/duplicates/__init__.py +5 -0
  369. numdaplot/tables/duplicates/deduplicated_frame.py +66 -0
  370. numdaplot/tables/duplicates/deduplication.py +88 -0
  371. numdaplot/tables/duplicates/keep.py +81 -0
  372. numdaplot/tables/files/__init__.py +5 -0
  373. numdaplot/tables/files/column_names.py +60 -0
  374. numdaplot/tables/files/csv_file.py +265 -0
  375. numdaplot/tables/files/csv_read_options.py +89 -0
  376. numdaplot/tables/files/csv_separator.py +41 -0
  377. numdaplot/tables/files/csv_write_options.py +79 -0
  378. numdaplot/tables/files/decimal_count.py +42 -0
  379. numdaplot/tables/files/encoding.py +82 -0
  380. numdaplot/tables/files/excel_file.py +171 -0
  381. numdaplot/tables/files/excel_read_options.py +79 -0
  382. numdaplot/tables/files/excel_sheet.py +50 -0
  383. numdaplot/tables/files/excel_time_cells.py +146 -0
  384. numdaplot/tables/files/excel_write_options.py +63 -0
  385. numdaplot/tables/files/file_access.py +152 -0
  386. numdaplot/tables/files/file_paths.py +106 -0
  387. numdaplot/tables/files/json_decimals.py +387 -0
  388. numdaplot/tables/files/json_file.py +203 -0
  389. numdaplot/tables/files/json_layout.py +63 -0
  390. numdaplot/tables/files/json_read_options.py +64 -0
  391. numdaplot/tables/files/json_write_options.py +71 -0
  392. numdaplot/tables/files/missing_texts.py +63 -0
  393. numdaplot/tables/files/optional_package.py +42 -0
  394. numdaplot/tables/files/pandas_backend.py +11 -0
  395. numdaplot/tables/files/parquet_file.py +91 -0
  396. numdaplot/tables/files/parquet_read_options.py +56 -0
  397. numdaplot/tables/files/sas_file.py +94 -0
  398. numdaplot/tables/files/sas_read_options.py +67 -0
  399. numdaplot/tables/files/stata_file.py +83 -0
  400. numdaplot/tables/files/stata_read_options.py +56 -0
  401. numdaplot/tables/files/xpt_read_options.py +65 -0
  402. numdaplot/tables/filtering/__init__.py +5 -0
  403. numdaplot/tables/filtering/checked_frame.py +60 -0
  404. numdaplot/tables/filtering/column_mask.py +71 -0
  405. numdaplot/tables/filtering/column_match.py +62 -0
  406. numdaplot/tables/filtering/condition.py +94 -0
  407. numdaplot/tables/filtering/filter.py +74 -0
  408. numdaplot/tables/filtering/filter_mode.py +67 -0
  409. numdaplot/tables/filtering/row_mask.py +152 -0
  410. numdaplot/tables/filtering/rule_moments.py +164 -0
  411. numdaplot/tables/frames/__init__.py +5 -0
  412. numdaplot/tables/frames/array_frame.py +95 -0
  413. numdaplot/tables/frames/cleaned_names.py +132 -0
  414. numdaplot/tables/frames/column.py +15 -0
  415. numdaplot/tables/frames/column_values.py +273 -0
  416. numdaplot/tables/frames/frame_equality.py +130 -0
  417. numdaplot/tables/frames/frame_normalization.py +459 -0
  418. numdaplot/tables/frames/named_column_errors.py +85 -0
  419. numdaplot/tables/frames/pandas_decimals.py +113 -0
  420. numdaplot/tables/frames/region_positions.py +113 -0
  421. numdaplot/tables/frames/table_text.py +222 -0
  422. numdaplot/tables/frames/time_columns.py +345 -0
  423. numdaplot/tables/frames/time_range_errors.py +117 -0
  424. numdaplot/tables/frames/time_zones.py +271 -0
  425. numdaplot/tables/joining/__init__.py +5 -0
  426. numdaplot/tables/joining/join.py +110 -0
  427. numdaplot/tables/joining/join_keys.py +367 -0
  428. numdaplot/tables/joining/join_mode.py +93 -0
  429. numdaplot/tables/joining/join_relation.py +149 -0
  430. numdaplot/tables/joining/join_suffixes.py +71 -0
  431. numdaplot/tables/joining/joined_frame.py +166 -0
  432. numdaplot/tables/joining/joined_names.py +107 -0
  433. numdaplot/tables/joining/joined_rows.py +235 -0
  434. numdaplot/tables/joining/key_types.py +57 -0
  435. numdaplot/tables/joining/relation.py +78 -0
  436. numdaplot/tables/missing/__init__.py +5 -0
  437. numdaplot/tables/missing/missing_count.py +59 -0
  438. numdaplot/tables/missing/missing_counts.py +214 -0
  439. numdaplot/tables/missing/missing_drop.py +98 -0
  440. numdaplot/tables/missing/missing_mode.py +63 -0
  441. numdaplot/tables/missing/missing_ratio.py +71 -0
  442. numdaplot/tables/missing/missing_removal.py +257 -0
  443. numdaplot/tables/missing/missing_summary.py +174 -0
  444. numdaplot/tables/missing/ratio_comparison.py +70 -0
  445. numdaplot/tables/pivot/__init__.py +5 -0
  446. numdaplot/tables/pivot/pivot_table.py +104 -0
  447. numdaplot/tables/pivot/pivoted_frame.py +244 -0
  448. numdaplot/tables/preview/__init__.py +5 -0
  449. numdaplot/tables/preview/notebook_display.py +238 -0
  450. numdaplot/tables/preview/preview.py +100 -0
  451. numdaplot/tables/preview/preview_rows.py +55 -0
  452. numdaplot/tables/preview/shown_columns.py +62 -0
  453. numdaplot/tables/preview/side.py +82 -0
  454. numdaplot/tables/sorting/__init__.py +5 -0
  455. numdaplot/tables/sorting/sort_key.py +71 -0
  456. numdaplot/tables/sorting/sorted_frame.py +81 -0
  457. numdaplot/tables/sorting/sorting.py +82 -0
  458. numdaplot/tables/table.py +71 -0
  459. numdaplot/tables/table_calculation.py +172 -0
  460. numdaplot/tables/table_columns.py +214 -0
  461. numdaplot/tables/table_conversion.py +351 -0
  462. numdaplot/tables/table_data.py +321 -0
  463. numdaplot/tables/table_display.py +56 -0
  464. numdaplot/tables/table_joining.py +80 -0
  465. numdaplot/tables/table_layout.py +105 -0
  466. numdaplot/tables/table_missing.py +146 -0
  467. numdaplot/tables/table_reading.py +451 -0
  468. numdaplot/tables/table_refusals.py +295 -0
  469. numdaplot/tables/table_selection.py +163 -0
  470. numdaplot/tables/table_writing.py +269 -0
  471. numdaplot-0.1.0.dist-info/METADATA +176 -0
  472. numdaplot-0.1.0.dist-info/RECORD +474 -0
  473. numdaplot-0.1.0.dist-info/WHEEL +4 -0
  474. numdaplot-0.1.0.dist-info/licenses/LICENSE +28 -0
@@ -0,0 +1,213 @@
1
+ """
2
+ Creation of a Plot of lines, bars or points, the charts ``add_*`` can also draw over a Plot.
3
+
4
+ .. versionadded:: 0.1.0
5
+ """
6
+
7
+ from typing import Self
8
+
9
+ from numdaplot.arrays.array import Array
10
+ from numdaplot.plots.charts.bar_chart import BarChart
11
+ from numdaplot.plots.charts.line_chart import LineChart
12
+ from numdaplot.plots.charts.scatter_chart import ScatterChart
13
+ from numdaplot.plots.layer_reading import read_bar_layer, read_line_layer, read_scatter_layer
14
+ from numdaplot.plots.plot_data import PlotData
15
+ from numdaplot.plots.style.plot_style import PlotStyle
16
+ from numdaplot.settings.argument_types import checked_arguments
17
+ from numdaplot.tables.table import Table
18
+
19
+
20
+ class PlotSeriesCreation(PlotData):
21
+ """
22
+ Creation of a Plot of lines, bars or points.
23
+
24
+ Use ``ndp.Plot.line``, ``ndp.Plot.bar`` and ``ndp.Plot.scatter``.
25
+
26
+ .. versionadded:: 0.1.0
27
+ """
28
+
29
+ @classmethod
30
+ @checked_arguments
31
+ def line(cls, data: Table | Array, chart: LineChart | None = None, style: PlotStyle | None = None) -> Self:
32
+ """
33
+ Return a Plot drawing columns of numbers or times of day as lines.
34
+
35
+ For a Table, ``LineChart.y`` names the columns drawn and ``LineChart.x`` the column of the positions. For an
36
+ Array of one or two dimensions, each column is a line and each row is placed at its number.
37
+
38
+ .. versionadded:: 0.1.0
39
+
40
+ Parameters
41
+ ----------
42
+ data
43
+ The Table or the Array drawn.
44
+ chart
45
+ The columns drawn and the look of the lines.
46
+ The default ``LineChart`` when omitted, which draws an Array: a Table needs the columns named.
47
+ style
48
+ The look of the Plot, the default ``PlotStyle`` when omitted.
49
+
50
+ Returns
51
+ -------
52
+ Self
53
+ The Plot, which ``show`` displays and ``save`` writes as an image.
54
+
55
+ Raises
56
+ ------
57
+ InvalidTypeError
58
+ When an argument is not of the type its annotation names.
59
+ InvalidChartDataError
60
+ When a Table has no ``y`` columns, or an Array has ``x`` or ``y`` columns.
61
+ ColumnNotFoundError
62
+ When a column does not exist.
63
+ IncompatibleTypesError
64
+ When ``x`` holds booleans or durations, or a drawn column holds neither numbers nor times of day, or the
65
+ drawn columns mix them.
66
+ DimensionError
67
+ When an Array has more than two dimensions.
68
+ InvalidColorCountError
69
+ When the colors of the chart are not one per line.
70
+
71
+ Examples
72
+ --------
73
+ >>> import numdaplot as ndp
74
+ >>> days = ndp.Array.from_list([1, 2, 3, 4, 5])
75
+ >>> prices = ndp.Array.from_list([12.0, 15.5, 14.0, 17.0, 16.0])
76
+ >>> costs = ndp.Array.from_list([8.0, 9.5, 9.0, None, 10.5])
77
+ >>> sales = ndp.Table.from_arrays({"day": days, "price": prices, "cost": costs})
78
+ >>> chart = ndp.LineChart(x="day", y=["price", "cost"], marker=ndp.MarkerShape.CIRCLE)
79
+ >>> style = ndp.PlotStyle(title="Sales", y_label="Euros")
80
+ >>> plot = ndp.Plot.line(sales, chart, style)
81
+ >>> plot.show()
82
+ """
83
+ if chart is None:
84
+ chart = LineChart()
85
+
86
+ layer = read_line_layer(data, chart)
87
+ plot = cls._create_from_layer(layer, style)
88
+
89
+ return plot
90
+
91
+ @classmethod
92
+ @checked_arguments
93
+ def bar(cls, data: Table | Array, chart: BarChart | None = None, style: PlotStyle | None = None) -> Self:
94
+ """
95
+ Return a Plot drawing columns of numbers as bars.
96
+
97
+ For a Table, ``BarChart.y`` names the columns drawn and ``BarChart.x`` the column labeling the bars. For an
98
+ Array of one or two dimensions, each column is a series of bars and each row is labeled with its number.
99
+
100
+ .. versionadded:: 0.1.0
101
+
102
+ Parameters
103
+ ----------
104
+ data
105
+ The Table or the Array drawn.
106
+ chart
107
+ The columns drawn and the look of the bars.
108
+ The default ``BarChart`` when omitted, which draws an Array: a Table needs the columns named.
109
+ style
110
+ The look of the Plot, the default ``PlotStyle`` when omitted.
111
+
112
+ Returns
113
+ -------
114
+ Self
115
+ The Plot, which ``show`` displays and ``save`` writes as an image.
116
+
117
+ Raises
118
+ ------
119
+ InvalidTypeError
120
+ When an argument is not of the type its annotation names.
121
+ InvalidChartDataError
122
+ When a Table has no ``y`` columns, or an Array has ``x`` or ``y`` columns.
123
+ ColumnNotFoundError
124
+ When a column does not exist.
125
+ IncompatibleTypesError
126
+ When ``x`` holds booleans or durations, or a drawn column does not hold numbers.
127
+ DimensionError
128
+ When an Array has more than two dimensions.
129
+ InvalidColorCountError
130
+ When the colors of the chart are not one per series.
131
+
132
+ Examples
133
+ --------
134
+ >>> import numdaplot as ndp
135
+ >>> cities = ndp.Array.from_list(["Paris", "Lyon", "Pau", "Nice"])
136
+ >>> sales_2025 = ndp.Array.from_list([120.0, 80.0, 45.0, 60.0])
137
+ >>> sales_2026 = ndp.Array.from_list([150.0, 95.0, 40.0, 70.0])
138
+ >>> sales = ndp.Table.from_arrays({"city": cities, "2025": sales_2025, "2026": sales_2026})
139
+ >>> chart = ndp.BarChart(x="city", y=["2025", "2026"], layout=ndp.BarLayout.STACKED)
140
+ >>> style = ndp.PlotStyle(title="Sales per city", y_label="Thousands of euros")
141
+ >>> plot = ndp.Plot.bar(sales, chart, style)
142
+ >>> plot.show()
143
+ """
144
+ if chart is None:
145
+ chart = BarChart()
146
+
147
+ layer = read_bar_layer(data, chart)
148
+ plot = cls._create_from_layer(layer, style)
149
+
150
+ return plot
151
+
152
+ @classmethod
153
+ @checked_arguments
154
+ def scatter(cls, data: Table | Array, chart: ScatterChart | None = None, style: PlotStyle | None = None) -> Self:
155
+ """
156
+ Return a Plot drawing each row as a point.
157
+
158
+ For a Table, ``ScatterChart.y`` names the column of the vertical positions and ``ScatterChart.x`` the column of
159
+ the horizontal ones, and the points can be colored and sized by other columns. For an Array of one or two
160
+ dimensions, each column is a series of points and each row is placed at its number.
161
+
162
+ .. versionadded:: 0.1.0
163
+
164
+ Parameters
165
+ ----------
166
+ data
167
+ The Table or the Array drawn.
168
+ chart
169
+ The columns drawn and the look of the points.
170
+ The default ``ScatterChart`` when omitted, which draws an Array: a Table needs the columns named.
171
+ style
172
+ The look of the Plot, the default ``PlotStyle`` when omitted.
173
+
174
+ Returns
175
+ -------
176
+ Self
177
+ The Plot, which ``show`` displays and ``save`` writes as an image.
178
+
179
+ Raises
180
+ ------
181
+ InvalidTypeError
182
+ When an argument is not of the type its annotation names.
183
+ InvalidChartDataError
184
+ When a Table has no ``y`` column, or an Array has a column setting.
185
+ ColumnNotFoundError
186
+ When a column does not exist.
187
+ IncompatibleTypesError
188
+ When ``x`` holds booleans or durations, ``y`` holds neither numbers nor times of day, ``size_by`` does
189
+ not hold numbers, or ``color_by`` holds neither numbers, texts, booleans nor times of day.
190
+ DimensionError
191
+ When an Array has more than two dimensions.
192
+ InvalidColorCountError
193
+ When ``color`` is given for an Array of several columns.
194
+
195
+ Examples
196
+ --------
197
+ >>> import numdaplot as ndp
198
+ >>> surfaces = ndp.Array.from_list([30.0, 45.0, 60.0, 80.0, 52.0, 38.0])
199
+ >>> prices = ndp.Array.from_list([150.0, 210.0, 260.0, 330.0, 190.0, 160.0])
200
+ >>> rooms = ndp.Array.from_list([1, 2, 3, 4, 3, 2])
201
+ >>> flats = ndp.Table.from_arrays({"surface": surfaces, "price": prices, "rooms": rooms})
202
+ >>> chart = ndp.ScatterChart(x="surface", y="price", color_by="rooms")
203
+ >>> style = ndp.PlotStyle(x_label="Surface (m2)", y_label="Price (thousands of euros)")
204
+ >>> plot = ndp.Plot.scatter(flats, chart, style)
205
+ >>> plot.show()
206
+ """
207
+ if chart is None:
208
+ chart = ScatterChart()
209
+
210
+ layer = read_scatter_layer(data, chart)
211
+ plot = cls._create_from_layer(layer, style)
212
+
213
+ return plot
@@ -0,0 +1,5 @@
1
+ """
2
+ Look of a whole Plot: title, axis labels, legend, grid lines, size and colors.
3
+
4
+ .. versionadded:: 0.1.0
5
+ """
@@ -0,0 +1,60 @@
1
+ """
2
+ Check of the style of a chart without axes.
3
+
4
+ .. versionadded:: 0.1.0
5
+ """
6
+
7
+ from numdaplot.errors.refused_setting_error import RefusedSettingError
8
+ from numdaplot.plots.style.plot_style import PlotStyle
9
+
10
+ CHART_NAME = "PieChart"
11
+ X_LABEL_SETTING = "x_label"
12
+ Y_LABEL_SETTING = "y_label"
13
+ RIGHT_LABEL_SETTING = "right_label"
14
+ X_TICK_ROTATION_SETTING = "x_tick_rotation"
15
+ Y_TICK_ROTATION_SETTING = "y_tick_rotation"
16
+
17
+
18
+ def require_no_axis_settings(style: PlotStyle | None) -> None:
19
+ """
20
+ Check that the style of a pie has no axis setting, a pie having no axes.
21
+
22
+ The grid lines and the legend keep their default values, so a pie leaves them without effect.
23
+
24
+ .. versionadded:: 0.1.0
25
+
26
+ Parameters
27
+ ----------
28
+ style
29
+ The style given, or None.
30
+
31
+ Raises
32
+ ------
33
+ RefusedSettingError
34
+ When the style has an ``x_label``, a ``y_label``, a ``right_label``, an ``x_tick_rotation`` or a
35
+ ``y_tick_rotation``.
36
+
37
+ Examples
38
+ --------
39
+ >>> import numdaplot as ndp
40
+ >>> from numdaplot.plots.style.axis_settings import require_no_axis_settings
41
+ >>> try:
42
+ ... require_no_axis_settings(ndp.PlotStyle(x_tick_rotation=45))
43
+ ... except ndp.RefusedSettingError as error:
44
+ ... print(error)
45
+ PieChart does not accept x_tick_rotation.
46
+ """
47
+ if style is None:
48
+ return
49
+
50
+ axis_settings = [
51
+ (X_LABEL_SETTING, style.x_label),
52
+ (Y_LABEL_SETTING, style.y_label),
53
+ (RIGHT_LABEL_SETTING, style.right_label),
54
+ (X_TICK_ROTATION_SETTING, style.x_tick_rotation),
55
+ (Y_TICK_ROTATION_SETTING, style.y_tick_rotation),
56
+ ]
57
+
58
+ for setting_name, setting_value in axis_settings:
59
+ if setting_value is not None:
60
+ raise RefusedSettingError(setting_name, CHART_NAME)
@@ -0,0 +1,168 @@
1
+ """
2
+ Named colors of the series of a chart.
3
+
4
+ .. versionadded:: 0.1.0
5
+ """
6
+
7
+ from enum import Enum, auto
8
+
9
+
10
+ class Color(Enum):
11
+ """
12
+ Named colors of the series of a chart: the ten colors of the default cycle, then black.
13
+
14
+ Write any other color with ``CustomColor``.
15
+
16
+ .. versionadded:: 0.1.0
17
+
18
+ Examples
19
+ --------
20
+ >>> import numdaplot as ndp
21
+ >>> prices = ndp.Array.from_list([12.0, 15.5, 14.0, 17.0])
22
+ >>> chart = ndp.LineChart(colors=[ndp.Color.GREEN])
23
+ >>> plot = ndp.Plot.line(prices, chart)
24
+ >>> plot.show()
25
+ """
26
+
27
+ BLUE = auto()
28
+ """
29
+ Blue, ``#1f77b4``, the first color of the default cycle.
30
+
31
+ Examples
32
+ --------
33
+ >>> import numdaplot as ndp
34
+ >>> prices = ndp.Array.from_list([12.0, 15.5, 14.0, 17.0])
35
+ >>> chart = ndp.LineChart(colors=[ndp.Color.BLUE])
36
+ >>> plot = ndp.Plot.line(prices, chart)
37
+ >>> plot.show()
38
+ """
39
+
40
+ ORANGE = auto()
41
+ """
42
+ Orange, ``#ff7f0e``.
43
+
44
+ Examples
45
+ --------
46
+ >>> import numdaplot as ndp
47
+ >>> prices = ndp.Array.from_list([12.0, 15.5, 14.0, 17.0])
48
+ >>> chart = ndp.LineChart(colors=[ndp.Color.ORANGE])
49
+ >>> plot = ndp.Plot.line(prices, chart)
50
+ >>> plot.show()
51
+ """
52
+
53
+ GREEN = auto()
54
+ """
55
+ Green, ``#2ca02c``.
56
+
57
+ Examples
58
+ --------
59
+ >>> import numdaplot as ndp
60
+ >>> prices = ndp.Array.from_list([12.0, 15.5, 14.0, 17.0])
61
+ >>> chart = ndp.LineChart(colors=[ndp.Color.GREEN])
62
+ >>> plot = ndp.Plot.line(prices, chart)
63
+ >>> plot.show()
64
+ """
65
+
66
+ RED = auto()
67
+ """
68
+ Red, ``#d62728``.
69
+
70
+ Examples
71
+ --------
72
+ >>> import numdaplot as ndp
73
+ >>> prices = ndp.Array.from_list([12.0, 15.5, 14.0, 17.0])
74
+ >>> chart = ndp.LineChart(colors=[ndp.Color.RED])
75
+ >>> plot = ndp.Plot.line(prices, chart)
76
+ >>> plot.show()
77
+ """
78
+
79
+ PURPLE = auto()
80
+ """
81
+ Purple, ``#9467bd``.
82
+
83
+ Examples
84
+ --------
85
+ >>> import numdaplot as ndp
86
+ >>> prices = ndp.Array.from_list([12.0, 15.5, 14.0, 17.0])
87
+ >>> chart = ndp.LineChart(colors=[ndp.Color.PURPLE])
88
+ >>> plot = ndp.Plot.line(prices, chart)
89
+ >>> plot.show()
90
+ """
91
+
92
+ BROWN = auto()
93
+ """
94
+ Brown, ``#8c564b``.
95
+
96
+ Examples
97
+ --------
98
+ >>> import numdaplot as ndp
99
+ >>> prices = ndp.Array.from_list([12.0, 15.5, 14.0, 17.0])
100
+ >>> chart = ndp.LineChart(colors=[ndp.Color.BROWN])
101
+ >>> plot = ndp.Plot.line(prices, chart)
102
+ >>> plot.show()
103
+ """
104
+
105
+ PINK = auto()
106
+ """
107
+ Pink, ``#e377c2``.
108
+
109
+ Examples
110
+ --------
111
+ >>> import numdaplot as ndp
112
+ >>> prices = ndp.Array.from_list([12.0, 15.5, 14.0, 17.0])
113
+ >>> chart = ndp.LineChart(colors=[ndp.Color.PINK])
114
+ >>> plot = ndp.Plot.line(prices, chart)
115
+ >>> plot.show()
116
+ """
117
+
118
+ GRAY = auto()
119
+ """
120
+ Gray, ``#7f7f7f``.
121
+
122
+ Examples
123
+ --------
124
+ >>> import numdaplot as ndp
125
+ >>> prices = ndp.Array.from_list([12.0, 15.5, 14.0, 17.0])
126
+ >>> chart = ndp.LineChart(colors=[ndp.Color.GRAY])
127
+ >>> plot = ndp.Plot.line(prices, chart)
128
+ >>> plot.show()
129
+ """
130
+
131
+ OLIVE = auto()
132
+ """
133
+ Olive, ``#bcbd22``.
134
+
135
+ Examples
136
+ --------
137
+ >>> import numdaplot as ndp
138
+ >>> prices = ndp.Array.from_list([12.0, 15.5, 14.0, 17.0])
139
+ >>> chart = ndp.LineChart(colors=[ndp.Color.OLIVE])
140
+ >>> plot = ndp.Plot.line(prices, chart)
141
+ >>> plot.show()
142
+ """
143
+
144
+ CYAN = auto()
145
+ """
146
+ Cyan, ``#17becf``.
147
+
148
+ Examples
149
+ --------
150
+ >>> import numdaplot as ndp
151
+ >>> prices = ndp.Array.from_list([12.0, 15.5, 14.0, 17.0])
152
+ >>> chart = ndp.LineChart(colors=[ndp.Color.CYAN])
153
+ >>> plot = ndp.Plot.line(prices, chart)
154
+ >>> plot.show()
155
+ """
156
+
157
+ BLACK = auto()
158
+ """
159
+ Black, ``#000000``.
160
+
161
+ Examples
162
+ --------
163
+ >>> import numdaplot as ndp
164
+ >>> prices = ndp.Array.from_list([12.0, 15.5, 14.0, 17.0])
165
+ >>> chart = ndp.LineChart(colors=[ndp.Color.BLACK])
166
+ >>> plot = ndp.Plot.line(prices, chart)
167
+ >>> plot.show()
168
+ """
@@ -0,0 +1,65 @@
1
+ """
2
+ A color of a chart written as ``#rrggbb``.
3
+
4
+ .. versionadded:: 0.1.0
5
+ """
6
+
7
+ import re
8
+ from dataclasses import dataclass
9
+
10
+ from numdaplot.errors.invalid_color_error import InvalidColorError
11
+ from numdaplot.settings.field_types import require_field_types
12
+
13
+ COLOR_PATTERN = re.compile(r"#[0-9a-fA-F]{6}")
14
+
15
+
16
+ @dataclass(frozen=True)
17
+ class CustomColor:
18
+ """
19
+ A color of a chart written as ``#`` followed by its red, green and blue parts in hexadecimal.
20
+
21
+ Accepted wherever a ``Color`` is, for the colors the named ones do not cover.
22
+
23
+ .. versionadded:: 0.1.0
24
+
25
+ Parameters
26
+ ----------
27
+ code
28
+ The color, such as ``"#ff8800"`` for orange, in lowercase or uppercase.
29
+
30
+ Raises
31
+ ------
32
+ InvalidTypeError
33
+ When a setting is not of the type its annotation names.
34
+ InvalidColorError
35
+ When the code is not ``#`` followed by six hexadecimal digits.
36
+
37
+ Examples
38
+ --------
39
+ >>> import numdaplot as ndp
40
+ >>> prices = ndp.Array.from_list([12.0, 15.5, 14.0, 17.0])
41
+ >>> chart = ndp.LineChart(colors=[ndp.CustomColor("#ff8800")])
42
+ >>> plot = ndp.Plot.line(prices, chart)
43
+ >>> plot.show()
44
+ """
45
+
46
+ code: str
47
+
48
+ def __post_init__(self) -> None:
49
+ """
50
+ Check that the code is ``#`` followed by six hexadecimal digits.
51
+
52
+ .. versionadded:: 0.1.0
53
+
54
+ Raises
55
+ ------
56
+ InvalidTypeError
57
+ When a setting is not of the type its annotation names.
58
+ InvalidColorError
59
+ When the code is not ``#`` followed by six hexadecimal digits.
60
+ """
61
+ require_field_types(self)
62
+
63
+ code_match = COLOR_PATTERN.fullmatch(self.code)
64
+ if code_match is None:
65
+ raise InvalidColorError(self.code)
@@ -0,0 +1,49 @@
1
+ """
2
+ Whether a Plot draws grid lines behind its values.
3
+
4
+ .. versionadded:: 0.1.0
5
+ """
6
+
7
+ from enum import Enum, auto
8
+
9
+
10
+ class GridLines(Enum):
11
+ """
12
+ Whether a Plot draws light grid lines behind its values, used by ``PlotStyle``.
13
+
14
+ .. versionadded:: 0.1.0
15
+
16
+ Examples
17
+ --------
18
+ >>> import numdaplot as ndp
19
+ >>> prices = ndp.Array.from_list([12.0, 15.5, 14.0, 17.0])
20
+ >>> style = ndp.PlotStyle(grid_lines=ndp.GridLines.HIDDEN)
21
+ >>> plot = ndp.Plot.line(prices, style=style)
22
+ >>> plot.show()
23
+ """
24
+
25
+ SHOWN = auto()
26
+ """
27
+ Light grid lines at each tick of the axes. Default value.
28
+
29
+ Examples
30
+ --------
31
+ >>> import numdaplot as ndp
32
+ >>> prices = ndp.Array.from_list([12.0, 15.5, 14.0, 17.0])
33
+ >>> style = ndp.PlotStyle(grid_lines=ndp.GridLines.SHOWN)
34
+ >>> plot = ndp.Plot.line(prices, style=style)
35
+ >>> plot.show()
36
+ """
37
+
38
+ HIDDEN = auto()
39
+ """
40
+ No grid lines.
41
+
42
+ Examples
43
+ --------
44
+ >>> import numdaplot as ndp
45
+ >>> prices = ndp.Array.from_list([12.0, 15.5, 14.0, 17.0])
46
+ >>> style = ndp.PlotStyle(grid_lines=ndp.GridLines.HIDDEN)
47
+ >>> plot = ndp.Plot.line(prices, style=style)
48
+ >>> plot.show()
49
+ """
@@ -0,0 +1,71 @@
1
+ """
2
+ Settings of a PNG image of a Plot.
3
+
4
+ .. versionadded:: 0.1.0
5
+ """
6
+
7
+ from dataclasses import dataclass
8
+
9
+ from numdaplot.errors.invalid_resolution_error import InvalidResolutionError
10
+ from numdaplot.settings.field_types import require_field_types
11
+
12
+ DEFAULT_DPI = 100
13
+ MINIMUM_DPI = 1
14
+
15
+
16
+ @dataclass(frozen=True)
17
+ class ImageOptions:
18
+ """
19
+ Settings of a PNG image of a Plot, used by ``Plot.save``.
20
+
21
+ The format of an image always comes from the extension of its path. SVG and PDF images are drawn with
22
+ lines and texts, so they have no resolution and refuse these options.
23
+
24
+ .. versionadded:: 0.1.0
25
+
26
+ Parameters
27
+ ----------
28
+ dpi
29
+ The number of pixels per inch of the image, 100 by default. It only changes the sharpness: a Plot of
30
+ 6.4 by 4.8 inches gives 640 by 480 pixels at 100, and 1280 by 960 pixels at 200.
31
+
32
+ Raises
33
+ ------
34
+ InvalidTypeError
35
+ When a setting is not of the type its annotation names.
36
+ InvalidResolutionError
37
+ When ``dpi`` is lower than 1.
38
+
39
+ Examples
40
+ --------
41
+ >>> import tempfile
42
+ >>> from pathlib import Path
43
+ >>> from matplotlib.image import imread
44
+ >>> import numdaplot as ndp
45
+ >>> path = Path(tempfile.mkdtemp()) / "prices.png"
46
+ >>> prices = ndp.Array.from_list([12.0, 15.5, 14.0, 17.0])
47
+ >>> plot = ndp.Plot.line(prices)
48
+ >>> plot.save(path, ndp.ImageOptions(dpi=200))
49
+ >>> imread(path).shape
50
+ (960, 1280, 4)
51
+ """
52
+
53
+ dpi: int = DEFAULT_DPI
54
+
55
+ def __post_init__(self) -> None:
56
+ """
57
+ Check that the resolution is at least 1 dot per inch.
58
+
59
+ .. versionadded:: 0.1.0
60
+
61
+ Raises
62
+ ------
63
+ InvalidTypeError
64
+ When a setting is not of the type its annotation names.
65
+ InvalidResolutionError
66
+ When ``dpi`` is lower than 1.
67
+ """
68
+ require_field_types(self)
69
+
70
+ if self.dpi < MINIMUM_DPI:
71
+ raise InvalidResolutionError(self.dpi)