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,319 @@
1
+ """
2
+ Alignment of the charts of a Plot on shared ``x`` labels.
3
+
4
+ When bars or texts are overlaid, each ``x`` value is a label at its own position. The charts then share the
5
+ labels of all of them: the labels of the first chart in its order, followed by the new labels of the next ones,
6
+ and each value is placed on its label.
7
+
8
+ .. versionadded:: 0.1.0
9
+ """
10
+
11
+ from dataclasses import replace
12
+ from typing import Any, cast
13
+
14
+ import numpy
15
+ from numpy.typing import NDArray
16
+
17
+ from numdaplot.plots.chart_layer import ChartLayer
18
+ from numdaplot.plots.charts.bar_chart import BarChart
19
+ from numdaplot.plots.data.chart_values import ChartValues, Positions, Series
20
+ from numdaplot.plots.data.point_values import PointValues
21
+ from numdaplot.plots.data.position_kind import PositionKind
22
+ from numdaplot.plots.data.unique_labels import require_unique_labels
23
+ from numdaplot.plots.drawing.position_axis import write_position_labels
24
+
25
+ MINIMUM_SHARING_LAYERS = 2
26
+ NO_SOURCE = -1
27
+ TEXT_DTYPE = numpy.dtype(object)
28
+
29
+
30
+ def align_layers(layers: list[ChartLayer]) -> list[ChartLayer]:
31
+ """
32
+ Return the charts of a Plot placed on the same labels, when several of them share label positions.
33
+
34
+ .. versionadded:: 0.1.0
35
+
36
+ Parameters
37
+ ----------
38
+ layers
39
+ The charts of the Plot and their values.
40
+
41
+ Returns
42
+ -------
43
+ list[ChartLayer]
44
+ The same charts, on the merged labels when bars or texts are overlaid, unchanged otherwise.
45
+
46
+ Raises
47
+ ------
48
+ DuplicateLabelError
49
+ When a label appears twice in the ``x`` values of one overlaid chart.
50
+
51
+ Examples
52
+ --------
53
+ >>> import numdaplot as ndp
54
+ >>> from numdaplot.plots.chart_layer import ChartLayer
55
+ >>> from numdaplot.plots.data.table_values import read_table_values
56
+ >>> from numdaplot.plots.drawing.layer_alignment import align_layers
57
+ >>> sales = ndp.Table.from_arrays(
58
+ ... {"city": ndp.Array.from_list(["Paris", "Lyon"]), "sales": ndp.Array.from_list([120.0, 80.0])}
59
+ ... )
60
+ >>> targets = ndp.Table.from_arrays(
61
+ ... {"city": ndp.Array.from_list(["Pau", "Paris"]), "target": ndp.Array.from_list([40.0, 130.0])}
62
+ ... )
63
+ >>> bars = ChartLayer(ndp.BarChart(), read_table_values(sales, "city", ["sales"], "BarChart"))
64
+ >>> line = ChartLayer(ndp.LineChart(), read_table_values(targets, "city", ["target"], "LineChart"))
65
+ >>> aligned_line = align_layers([bars, line])[1]
66
+ >>> aligned_line.values.positions.values.tolist(), aligned_line.values.series[0].values.tolist()
67
+ (['Paris', 'Lyon', 'Pau'], [130.0, nan, 40.0])
68
+ """
69
+ shares_labels = needs_shared_labels(layers)
70
+ if not shares_labels:
71
+ return layers
72
+
73
+ layer_labels = [write_layer_labels(layer) for layer in layers]
74
+ merged_labels = merge_labels(layer_labels)
75
+ label_pairs = zip(layers, layer_labels, strict=True)
76
+ aligned_layers = [align_layer(layer, labels, merged_labels) for layer, labels in label_pairs]
77
+
78
+ return aligned_layers
79
+
80
+
81
+ def needs_shared_labels(layers: list[ChartLayer]) -> bool:
82
+ """
83
+ Return whether the charts of a Plot place their ``x`` values on shared labels.
84
+
85
+ .. versionadded:: 0.1.0
86
+
87
+ Parameters
88
+ ----------
89
+ layers
90
+ The charts of the Plot and their values.
91
+
92
+ Returns
93
+ -------
94
+ bool
95
+ True when several charts are overlaid and one of them draws bars or has texts as ``x`` values.
96
+
97
+ Examples
98
+ --------
99
+ >>> import numdaplot as ndp
100
+ >>> from numdaplot.plots.chart_layer import ChartLayer
101
+ >>> from numdaplot.plots.data.array_values import read_array_values
102
+ >>> from numdaplot.plots.drawing.layer_alignment import needs_shared_labels
103
+ >>> prices = ndp.Array.from_list([12.0, 15.5])
104
+ >>> line = ChartLayer(ndp.LineChart(), read_array_values(prices, "LineChart"))
105
+ >>> needs_shared_labels([line, line])
106
+ False
107
+ """
108
+ layer_count = len(layers)
109
+ if layer_count < MINIMUM_SHARING_LAYERS:
110
+ return False
111
+
112
+ for layer in layers:
113
+ values = cast(ChartValues, layer.values)
114
+ draws_bars = isinstance(layer.chart, BarChart)
115
+ has_texts = values.positions.kind == PositionKind.TEXTS
116
+ places_labels = draws_bars or has_texts
117
+ if places_labels:
118
+ return True
119
+
120
+ return False
121
+
122
+
123
+ def write_layer_labels(layer: ChartLayer) -> list[str]:
124
+ """
125
+ Return the label of each ``x`` value of a chart, after checking that none appears twice.
126
+
127
+ .. versionadded:: 0.1.0
128
+
129
+ Parameters
130
+ ----------
131
+ layer
132
+ A chart and its values.
133
+
134
+ Returns
135
+ -------
136
+ list[str]
137
+ The labels, such as ``"2026-01-01"`` for a date.
138
+
139
+ Raises
140
+ ------
141
+ DuplicateLabelError
142
+ When a label appears twice.
143
+
144
+ Examples
145
+ --------
146
+ >>> import numdaplot as ndp
147
+ >>> from numdaplot.plots.chart_layer import ChartLayer
148
+ >>> from numdaplot.plots.data.array_values import read_array_values
149
+ >>> from numdaplot.plots.drawing.layer_alignment import write_layer_labels
150
+ >>> prices = ndp.Array.from_list([12.0, 15.5])
151
+ >>> write_layer_labels(ChartLayer(ndp.BarChart(), read_array_values(prices, "BarChart")))
152
+ ['0', '1']
153
+ """
154
+ values = cast(ChartValues, layer.values)
155
+ labels = write_position_labels(values.positions)
156
+ require_unique_labels(labels)
157
+
158
+ return labels
159
+
160
+
161
+ def merge_labels(layer_labels: list[list[str]]) -> list[str]:
162
+ """
163
+ Return every label once: the labels of the first chart in its order, then the new labels of the next ones.
164
+
165
+ .. versionadded:: 0.1.0
166
+
167
+ Parameters
168
+ ----------
169
+ layer_labels
170
+ The labels of each chart.
171
+
172
+ Returns
173
+ -------
174
+ list[str]
175
+ The merged labels.
176
+
177
+ Examples
178
+ --------
179
+ >>> from numdaplot.plots.drawing.layer_alignment import merge_labels
180
+ >>> merge_labels([["Paris", "Lyon"], ["Pau", "Paris"]])
181
+ ['Paris', 'Lyon', 'Pau']
182
+ """
183
+ merged_labels = dict[str, None]()
184
+
185
+ for labels in layer_labels:
186
+ new_labels = dict.fromkeys(labels)
187
+ merged_labels.update(new_labels)
188
+
189
+ label_list = list(merged_labels)
190
+
191
+ return label_list
192
+
193
+
194
+ def align_layer(layer: ChartLayer, labels: list[str], merged_labels: list[str]) -> ChartLayer:
195
+ """
196
+ Return a chart with its values placed on the merged labels, missing where it has no value for a label.
197
+
198
+ .. versionadded:: 0.1.0
199
+
200
+ Parameters
201
+ ----------
202
+ layer
203
+ A chart and its values.
204
+ labels
205
+ The label of each of its ``x`` values.
206
+ merged_labels
207
+ The labels shared by every chart of the Plot.
208
+
209
+ Returns
210
+ -------
211
+ ChartLayer
212
+ The chart with text positions, its series and its point values reordered on the merged labels.
213
+
214
+ Examples
215
+ --------
216
+ >>> import numdaplot as ndp
217
+ >>> from numdaplot.plots.chart_layer import ChartLayer
218
+ >>> from numdaplot.plots.data.array_values import read_array_values
219
+ >>> from numdaplot.plots.drawing.layer_alignment import align_layer
220
+ >>> prices = ndp.Array.from_list([12.0, 15.5])
221
+ >>> layer = ChartLayer(ndp.BarChart(), read_array_values(prices, "BarChart"))
222
+ >>> align_layer(layer, ["0", "1"], ["1", "2", "0"]).values.series[0].values
223
+ array([15.5, nan, 12. ])
224
+ """
225
+ values = cast(ChartValues, layer.values)
226
+ label_rows = {label: i for i, label in enumerate(labels)}
227
+ source_rows = [label_rows.get(label, NO_SOURCE) for label in merged_labels]
228
+ sources = numpy.array(source_rows, dtype=numpy.intp)
229
+ merged_values = numpy.array(merged_labels, dtype=TEXT_DTYPE)
230
+ positions = Positions(PositionKind.TEXTS, merged_values, values.positions.name)
231
+ series = [Series(one_series.name, pick_values(one_series.values, sources)) for one_series in values.series]
232
+ label_count = len(merged_labels)
233
+ rows = numpy.arange(label_count)
234
+ aligned_values = ChartValues(positions, series, rows, values.value_name, values.value_type)
235
+ aligned_points = align_points(layer.points, sources)
236
+ aligned_layer = replace(layer, values=aligned_values, points=aligned_points)
237
+
238
+ return aligned_layer
239
+
240
+
241
+ def align_points(points: PointValues | None, sources: NDArray[numpy.intp]) -> PointValues | None:
242
+ """
243
+ Return the values coloring and sizing the points of a ScatterChart, reordered on the merged labels.
244
+
245
+ .. versionadded:: 0.1.0
246
+
247
+ Parameters
248
+ ----------
249
+ points
250
+ The values of the points, or None for a chart without them.
251
+ sources
252
+ For each merged label, the row of the chart holding its value, or -1 when the chart has none.
253
+
254
+ Returns
255
+ -------
256
+ PointValues or None
257
+ The reordered values, or None.
258
+
259
+ Examples
260
+ --------
261
+ >>> import numpy
262
+ >>> from numdaplot.plots.data.point_values import PointValues
263
+ >>> from numdaplot.plots.drawing.layer_alignment import align_points
264
+ >>> points = PointValues(None, None, "surface", numpy.array([30.0, 45.0]))
265
+ >>> align_points(points, numpy.array([1, -1])).sizes
266
+ array([45., nan])
267
+ """
268
+ if points is None:
269
+ return None
270
+
271
+ colors = None
272
+ if points.colors is not None:
273
+ colors = pick_values(points.colors, sources)
274
+
275
+ sizes = None
276
+ if points.sizes is not None:
277
+ sizes = pick_values(points.sizes, sources)
278
+
279
+ aligned_points = PointValues(points.color_name, colors, points.size_name, sizes)
280
+
281
+ return aligned_points
282
+
283
+
284
+ def pick_values(values: NDArray[Any], sources: NDArray[numpy.intp]) -> NDArray[Any]:
285
+ """
286
+ Return the values at given rows, missing where the row is -1.
287
+
288
+ .. versionadded:: 0.1.0
289
+
290
+ Parameters
291
+ ----------
292
+ values
293
+ Numbers, NaN for a missing one, or texts, None for a missing one.
294
+ sources
295
+ The row of each value picked, or -1 for a missing value.
296
+
297
+ Returns
298
+ -------
299
+ NDArray
300
+ The picked values, of the same type: NaN or None where the row is -1.
301
+
302
+ Examples
303
+ --------
304
+ >>> import numpy
305
+ >>> from numdaplot.plots.drawing.layer_alignment import pick_values
306
+ >>> pick_values(numpy.array(["Paris", "Lyon"], dtype=object), numpy.array([1, -1, 0]))
307
+ array(['Lyon', None, 'Paris'], dtype=object)
308
+ """
309
+ missing_value = None
310
+ if values.dtype != TEXT_DTYPE:
311
+ missing_value = numpy.nan
312
+
313
+ value_count = len(sources)
314
+ picked_values = numpy.full(value_count, missing_value, dtype=values.dtype)
315
+ has_source = sources != NO_SOURCE
316
+ present_sources = sources[has_source]
317
+ picked_values[has_source] = values[present_sources]
318
+
319
+ return picked_values
@@ -0,0 +1,123 @@
1
+ """
2
+ Colors of the charts overlaid on a Plot.
3
+
4
+ .. versionadded:: 0.1.0
5
+ """
6
+
7
+ from dataclasses import replace
8
+ from typing import cast
9
+
10
+ from numdaplot.plots.chart_layer import ChartLayer
11
+ from numdaplot.plots.charts.bar_chart import BarChart
12
+ from numdaplot.plots.charts.line_chart import LineChart
13
+ from numdaplot.plots.charts.scatter_chart import ScatterChart
14
+ from numdaplot.plots.data.chart_values import ChartValues
15
+ from numdaplot.plots.drawing.series_colors import take_cycle_colors
16
+
17
+ SINGLE_SERIES = 1
18
+
19
+
20
+ def continue_color_cycle(layers: list[ChartLayer]) -> list[ChartLayer]:
21
+ """
22
+ Return the charts of a Plot with the default colors following each other from one chart to the next.
23
+
24
+ A chart without chosen colors takes the colors of the default cycle after the ones of the charts before it,
25
+ so blue bars are followed by an orange line.
26
+
27
+ .. versionadded:: 0.1.0
28
+
29
+ Parameters
30
+ ----------
31
+ layers
32
+ The charts of the Plot and their values.
33
+
34
+ Returns
35
+ -------
36
+ list[ChartLayer]
37
+ The same charts, the ones after the first given the colors of the cycle they take.
38
+
39
+ Examples
40
+ --------
41
+ >>> import numdaplot as ndp
42
+ >>> from numdaplot.plots.chart_layer import ChartLayer
43
+ >>> from numdaplot.plots.data.array_values import read_array_values
44
+ >>> from numdaplot.plots.drawing.layer_colors import continue_color_cycle
45
+ >>> prices = ndp.Array.from_list([12.0, 15.5])
46
+ >>> bars = ChartLayer(ndp.BarChart(), read_array_values(prices, "BarChart"))
47
+ >>> line = ChartLayer(ndp.LineChart(), read_array_values(prices, "LineChart"))
48
+ >>> continue_color_cycle([bars, line])[1].chart.colors
49
+ [<Color.ORANGE: 2>]
50
+ """
51
+ colored_layers = list[ChartLayer]()
52
+ used_count = 0
53
+
54
+ for layer in layers:
55
+ values = cast(ChartValues, layer.values)
56
+ series_count = len(values.series)
57
+ colored_layer = give_cycle_colors(layer, used_count, series_count)
58
+ colored_layers.append(colored_layer)
59
+ used_count += series_count
60
+
61
+ return colored_layers
62
+
63
+
64
+ def give_cycle_colors(layer: ChartLayer, start: int, series_count: int) -> ChartLayer:
65
+ """
66
+ Return a chart given the colors of the default cycle from a start, when it has no chosen colors.
67
+
68
+ A ScatterChart takes a color for a single series without ``color_by`` only.
69
+
70
+ .. versionadded:: 0.1.0
71
+
72
+ Parameters
73
+ ----------
74
+ layer
75
+ A chart and its values.
76
+ start
77
+ The number of colors of the cycle used by the charts before it.
78
+ series_count
79
+ The number of series of the chart.
80
+
81
+ Returns
82
+ -------
83
+ ChartLayer
84
+ The chart with its colors, or the same chart when it keeps its own colors or comes first.
85
+
86
+ Examples
87
+ --------
88
+ >>> import numdaplot as ndp
89
+ >>> from numdaplot.plots.chart_layer import ChartLayer
90
+ >>> from numdaplot.plots.data.array_values import read_array_values
91
+ >>> from numdaplot.plots.drawing.layer_colors import give_cycle_colors
92
+ >>> prices = ndp.Array.from_list([12.0, 15.5])
93
+ >>> points = ChartLayer(ndp.ScatterChart(), read_array_values(prices, "ScatterChart"))
94
+ >>> give_cycle_colors(points, 2, 1).chart.color
95
+ <Color.GREEN: 3>
96
+ """
97
+ if start == 0:
98
+ return layer
99
+
100
+ chart = layer.chart
101
+ cycle_colors = take_cycle_colors(start, series_count)
102
+ if isinstance(chart, LineChart | BarChart):
103
+ if chart.colors is not None:
104
+ return layer
105
+
106
+ colored_chart = replace(chart, colors=cycle_colors)
107
+ colored_layer = replace(layer, chart=colored_chart)
108
+ return colored_layer
109
+
110
+ if not isinstance(chart, ScatterChart):
111
+ return layer
112
+
113
+ is_single_series = series_count == SINGLE_SERIES
114
+ has_no_color = chart.color is None
115
+ has_no_color_by = chart.color_by is None
116
+ takes_cycle_color = is_single_series and has_no_color and has_no_color_by
117
+ if not takes_cycle_color:
118
+ return layer
119
+
120
+ scatter_chart = replace(chart, color=cycle_colors[0])
121
+ scatter_layer = replace(layer, chart=scatter_chart)
122
+
123
+ return scatter_layer
@@ -0,0 +1,85 @@
1
+ """
2
+ Drawing of a LineChart.
3
+
4
+ .. versionadded:: 0.1.0
5
+ """
6
+
7
+ # The matplotlib stubs leave the keyword arguments of most drawing methods untyped.
8
+ # pyright: reportUnknownMemberType=false
9
+
10
+ from typing import cast
11
+
12
+ from matplotlib.axes import Axes
13
+
14
+ from numdaplot.plots.chart_layer import ChartLayer
15
+ from numdaplot.plots.charts.line_chart import LineChart
16
+ from numdaplot.plots.charts.line_type import LineType
17
+ from numdaplot.plots.data.chart_values import ChartValues
18
+ from numdaplot.plots.drawing.default_labels import find_position_label
19
+ from numdaplot.plots.drawing.drawn_chart import DrawnChart
20
+ from numdaplot.plots.drawing.grid_axes import GridAxes
21
+ from numdaplot.plots.drawing.marker_codes import MARKER_CODES
22
+ from numdaplot.plots.drawing.position_axis import place_positions
23
+ from numdaplot.plots.drawing.series_colors import choose_series_colors
24
+
25
+ LINE_STYLES = {
26
+ LineType.SOLID: "-",
27
+ LineType.DASHED: "--",
28
+ LineType.DOTTED: ":",
29
+ LineType.DASH_DOT: "-.",
30
+ }
31
+
32
+
33
+ def draw_line_chart(axes: Axes, layer: ChartLayer) -> DrawnChart:
34
+ """
35
+ Draw each series of a LineChart as a line.
36
+
37
+ .. versionadded:: 0.1.0
38
+
39
+ Parameters
40
+ ----------
41
+ axes
42
+ The matplotlib axes drawn on.
43
+ layer
44
+ A LineChart and its values.
45
+
46
+ Returns
47
+ -------
48
+ DrawnChart
49
+ The default labels, the ``x`` values on the horizontal axis, and grid lines across both axes.
50
+
51
+ Raises
52
+ ------
53
+ InvalidColorCountError
54
+ When the colors of the chart are not one per series.
55
+
56
+ Examples
57
+ --------
58
+ >>> import numdaplot as ndp
59
+ >>> from matplotlib.figure import Figure
60
+ >>> from numdaplot.plots.chart_layer import ChartLayer
61
+ >>> from numdaplot.plots.data.array_values import read_array_values
62
+ >>> from numdaplot.plots.drawing.line_drawing import draw_line_chart
63
+ >>> prices = ndp.Array.from_list([12.0, 15.5])
64
+ >>> axes = Figure().add_subplot()
65
+ >>> drawn_chart = draw_line_chart(axes, ChartLayer(ndp.LineChart(), read_array_values(prices, "LineChart")))
66
+ >>> axes.lines[0].get_ydata()
67
+ array([12. , 15.5])
68
+ """
69
+ chart = cast(LineChart, layer.chart)
70
+ values = cast(ChartValues, layer.values)
71
+ series_count = len(values.series)
72
+ color_codes = choose_series_colors(chart.colors, series_count)
73
+ coordinates = place_positions(axes, values.positions, False)
74
+ line_style = LINE_STYLES[chart.line]
75
+ marker_code = MARKER_CODES[chart.marker]
76
+
77
+ for series, color_code in zip(values.series, color_codes, strict=True):
78
+ axes.plot(
79
+ coordinates, series.values, color=color_code, linestyle=line_style, marker=marker_code, label=series.name
80
+ )
81
+
82
+ x_label = find_position_label(values.positions)
83
+ drawn_chart = DrawnChart(x_label, values.value_name, False, GridAxes.BOTH, None)
84
+
85
+ return drawn_chart
@@ -0,0 +1,20 @@
1
+ """
2
+ matplotlib codes of the marker shapes.
3
+
4
+ .. versionadded:: 0.1.0
5
+ """
6
+
7
+ from numdaplot.plots.charts.marker_shape import MarkerShape
8
+
9
+ MARKER_CODES = {
10
+ MarkerShape.NONE: "",
11
+ MarkerShape.CIRCLE: "o",
12
+ MarkerShape.SQUARE: "s",
13
+ MarkerShape.TRIANGLE: "^",
14
+ MarkerShape.CROSS: "x",
15
+ MarkerShape.DIAMOND: "D",
16
+ }
17
+ """The matplotlib code of each marker shape, an empty code drawing no marker.
18
+
19
+ .. versionadded:: 0.1.0
20
+ """