rgwfuncs 0.0.56__tar.gz → 0.0.58__tar.gz

Sign up to get free protection for your applications and to get access to all the features.
@@ -1,4 +1,4 @@
1
- Copyright (c) 2018 The Python Packaging Authority
1
+ Copyright (c) 2025 Ryan Gerard Wilson
2
2
 
3
3
  Permission is hereby granted, free of charge, to any person obtaining a copy
4
4
  of this software and associated documentation files (the "Software"), to deal
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.2
2
2
  Name: rgwfuncs
3
- Version: 0.0.56
3
+ Version: 0.0.58
4
4
  Summary: A functional programming paradigm for mathematical modelling and data science
5
5
  Home-page: https://github.com/ryangerardwilson/rgwfunc
6
6
  Author: Ryan Gerard Wilson
@@ -10,7 +10,7 @@ Project-URL: Issues, https://github.com/ryangerardwilson/rgwfuncs
10
10
  Classifier: Programming Language :: Python :: 3
11
11
  Classifier: License :: OSI Approved :: MIT License
12
12
  Classifier: Operating System :: OS Independent
13
- Requires-Python: >=3.12
13
+ Requires-Python: >=3.10
14
14
  Description-Content-Type: text/markdown
15
15
  License-File: LICENSE
16
16
  Requires-Dist: pandas
@@ -541,19 +541,58 @@ This function plots polynomial functions described by a list of expressions and
541
541
  {"x**2/(2 + a) + a": {"x": np.linspace(-3, 4, 101), "a": 1.23}},
542
542
  {"np.diff(x**3, 2)": {"x": np.linspace(-2, 2, 10)}}
543
543
  ],
544
- zoom=2
544
+ zoom=2,
545
+ open_file=True,
546
+ save_path="plot_polynomial_functions_example_1.svg"
545
547
  )
546
548
 
547
- # Write the SVG to an actual file
548
- with open("plot.svg", "w", encoding="utf-8") as file:
549
- file.write(plot_svg_string)
550
-
551
549
  • Displaying the SVG:
552
550
 
553
551
  ![Plot](./media/plot_polynomial_functions_example_1.svg)
554
552
 
555
553
  --------------------------------------------------------------------------------
556
554
 
555
+ ### 12. `plot_x_points_of_polynomial_functions`
556
+
557
+ This function plots one or more expressions described by a list of dictionaries. For each item in the list, the function evaluates the given Python/NumPy expression at the specified x-values (converted to NumPy arrays if they are Python lists) and plots the resulting points on a single figure.
558
+
559
+ • Parameters:
560
+ - `functions` (`List[Dict[str, Dict[str, Any]]]`): A list of one or more items, each of which has exactly one key-value pair:
561
+ - Key (`str`): A valid Python/NumPy expression (e.g., `x**2`, `np.sin(x)`, `x - a`).
562
+ - Value (`Dict[str, Any]`): Must assign `x` a value
563
+ - `zoom` (`float`): Numeric range from -zoom to +zoom on both x and y axes (default 10.0).
564
+ - `show_legend` (`bool`): If True, includes a legend (default True).
565
+ - `open_file` (bool):
566
+ - If True and `save_path` is given, opens that file with the system viewer.
567
+ - If True and `save_path` is None, writes to a temporary file and opens it (default False).
568
+ - `save_path` (`Optional[str]`): If specified, writes the resulting SVG to this path (default None).
569
+
570
+ • Returns:
571
+ - `str`: The raw SVG markup of the resulting scatter plot.
572
+
573
+ • Example:
574
+
575
+ from rgwfuncs import plot_x_points_of_polynomial_functions
576
+ import numpy as np
577
+
578
+ svg_output = plot_x_points_of_polynomial_functions(
579
+ functions=[
580
+ {"x**2": {"x": np.array([-2, -1, 0, 1, 2])}},
581
+ {"np.sin(x)": {"x": np.linspace(0, 2*np.pi, 5)}},
582
+ {"x - 3": {"x": np.array([-2, 0, 2, 4, 6])}}
583
+ ],
584
+ zoom=6,
585
+ show_legend=True,
586
+ open_file=True,
587
+ save_path="plot_x_points_of_polynomial_functions_example_5.svg"
588
+ )
589
+
590
+ • Displaying the SVG:
591
+
592
+ ![Plot](./media/plot_x_points_of_polynomial_functions_example_5.svg)
593
+
594
+ --------------------------------------------------------------------------------
595
+
557
596
  ## String Based Functions
558
597
 
559
598
  ### 1. send_telegram_message
@@ -1,30 +1,3 @@
1
- Metadata-Version: 2.2
2
- Name: rgwfuncs
3
- Version: 0.0.56
4
- Summary: A functional programming paradigm for mathematical modelling and data science
5
- Home-page: https://github.com/ryangerardwilson/rgwfunc
6
- Author: Ryan Gerard Wilson
7
- Author-email: Ryan Gerard Wilson <ryangerardwilson@gmail.com>
8
- Project-URL: Homepage, https://github.com/ryangerardwilson/rgwfuncs
9
- Project-URL: Issues, https://github.com/ryangerardwilson/rgwfuncs
10
- Classifier: Programming Language :: Python :: 3
11
- Classifier: License :: OSI Approved :: MIT License
12
- Classifier: Operating System :: OS Independent
13
- Requires-Python: >=3.12
14
- Description-Content-Type: text/markdown
15
- License-File: LICENSE
16
- Requires-Dist: pandas
17
- Requires-Dist: pymssql
18
- Requires-Dist: mysql-connector-python
19
- Requires-Dist: clickhouse-connect
20
- Requires-Dist: google-cloud-bigquery
21
- Requires-Dist: google-auth
22
- Requires-Dist: xgboost
23
- Requires-Dist: requests
24
- Requires-Dist: slack-sdk
25
- Requires-Dist: google-api-python-client
26
- Requires-Dist: boto3
27
-
28
1
  # RGWFUNCS
29
2
 
30
3
  ***By Ryan Gerard Wilson (https://ryangerardwilson.com)***
@@ -541,19 +514,58 @@ This function plots polynomial functions described by a list of expressions and
541
514
  {"x**2/(2 + a) + a": {"x": np.linspace(-3, 4, 101), "a": 1.23}},
542
515
  {"np.diff(x**3, 2)": {"x": np.linspace(-2, 2, 10)}}
543
516
  ],
544
- zoom=2
517
+ zoom=2,
518
+ open_file=True,
519
+ save_path="plot_polynomial_functions_example_1.svg"
545
520
  )
546
521
 
547
- # Write the SVG to an actual file
548
- with open("plot.svg", "w", encoding="utf-8") as file:
549
- file.write(plot_svg_string)
550
-
551
522
  • Displaying the SVG:
552
523
 
553
524
  ![Plot](./media/plot_polynomial_functions_example_1.svg)
554
525
 
555
526
  --------------------------------------------------------------------------------
556
527
 
528
+ ### 12. `plot_x_points_of_polynomial_functions`
529
+
530
+ This function plots one or more expressions described by a list of dictionaries. For each item in the list, the function evaluates the given Python/NumPy expression at the specified x-values (converted to NumPy arrays if they are Python lists) and plots the resulting points on a single figure.
531
+
532
+ • Parameters:
533
+ - `functions` (`List[Dict[str, Dict[str, Any]]]`): A list of one or more items, each of which has exactly one key-value pair:
534
+ - Key (`str`): A valid Python/NumPy expression (e.g., `x**2`, `np.sin(x)`, `x - a`).
535
+ - Value (`Dict[str, Any]`): Must assign `x` a value
536
+ - `zoom` (`float`): Numeric range from -zoom to +zoom on both x and y axes (default 10.0).
537
+ - `show_legend` (`bool`): If True, includes a legend (default True).
538
+ - `open_file` (bool):
539
+ - If True and `save_path` is given, opens that file with the system viewer.
540
+ - If True and `save_path` is None, writes to a temporary file and opens it (default False).
541
+ - `save_path` (`Optional[str]`): If specified, writes the resulting SVG to this path (default None).
542
+
543
+ • Returns:
544
+ - `str`: The raw SVG markup of the resulting scatter plot.
545
+
546
+ • Example:
547
+
548
+ from rgwfuncs import plot_x_points_of_polynomial_functions
549
+ import numpy as np
550
+
551
+ svg_output = plot_x_points_of_polynomial_functions(
552
+ functions=[
553
+ {"x**2": {"x": np.array([-2, -1, 0, 1, 2])}},
554
+ {"np.sin(x)": {"x": np.linspace(0, 2*np.pi, 5)}},
555
+ {"x - 3": {"x": np.array([-2, 0, 2, 4, 6])}}
556
+ ],
557
+ zoom=6,
558
+ show_legend=True,
559
+ open_file=True,
560
+ save_path="plot_x_points_of_polynomial_functions_example_5.svg"
561
+ )
562
+
563
+ • Displaying the SVG:
564
+
565
+ ![Plot](./media/plot_x_points_of_polynomial_functions_example_5.svg)
566
+
567
+ --------------------------------------------------------------------------------
568
+
557
569
  ## String Based Functions
558
570
 
559
571
  ### 1. send_telegram_message
@@ -4,13 +4,13 @@ build-backend = "setuptools.build_meta"
4
4
 
5
5
  [project]
6
6
  name = "rgwfuncs"
7
- version = "0.0.56"
7
+ version = "0.0.58"
8
8
  authors = [
9
9
  { name = "Ryan Gerard Wilson", email = "ryangerardwilson@gmail.com" },
10
10
  ]
11
11
  description = "A functional programming paradigm for mathematical modelling and data science"
12
12
  readme = "README.md"
13
- requires-python = ">=3.12"
13
+ requires-python = ">=3.10"
14
14
  classifiers = [
15
15
  "Programming Language :: Python :: 3",
16
16
  "License :: OSI Approved :: MIT License",
@@ -1,6 +1,6 @@
1
1
  [metadata]
2
2
  name = rgwfuncs
3
- version = 0.0.56
3
+ version = 0.0.58
4
4
  author = Ryan Gerard Wilson
5
5
  author_email = ryangerardwilson@gmail.com
6
6
  description = A functional programming paradigm for mathematical modelling and data science
@@ -16,7 +16,7 @@ classifiers =
16
16
  packages = find:
17
17
  package_dir =
18
18
  = src
19
- python_requires = >=3.8
19
+ python_requires = >=3.10
20
20
  install_requires =
21
21
  pandas
22
22
  pymssql
@@ -1,7 +1,7 @@
1
1
  # This file is automatically generated
2
2
  # Dynamically importing functions from modules
3
3
 
4
- from .algebra_lib import cancel_polynomial_expression, compute_constant_expression, compute_constant_expression_involving_matrices, compute_constant_expression_involving_ordered_series, compute_prime_factors, expand_polynomial_expression, factor_polynomial_expression, plot_polynomial_functions, python_polynomial_expression_to_latex, simplify_polynomial_expression, solve_homogeneous_polynomial_expression
4
+ from .algebra_lib import cancel_polynomial_expression, compute_constant_expression, compute_constant_expression_involving_matrices, compute_constant_expression_involving_ordered_series, compute_prime_factors, expand_polynomial_expression, factor_polynomial_expression, plot_polynomial_functions, plot_x_points_of_polynomial_functions, python_polynomial_expression_to_latex, simplify_polynomial_expression, solve_homogeneous_polynomial_expression
5
5
  from .df_lib import append_columns, append_percentile_classification_column, append_ranged_classification_column, append_ranged_date_classification_column, append_rows, append_xgb_labels, append_xgb_logistic_regression_predictions, append_xgb_regression_predictions, bag_union_join, bottom_n_unique_values, cascade_sort, delete_rows, drop_duplicates, drop_duplicates_retain_first, drop_duplicates_retain_last, filter_dataframe, filter_indian_mobiles, first_n_rows, from_raw_data, insert_dataframe_in_sqlite_database, last_n_rows, left_join, limit_dataframe, load_data_from_path, load_data_from_query, load_data_from_sqlite_path, mask_against_dataframe, mask_against_dataframe_converse, numeric_clean, order_columns, print_correlation, print_dataframe, print_memory_usage, print_n_frequency_cascading, print_n_frequency_linear, rename_columns, retain_columns, right_join, send_data_to_email, send_data_to_slack, send_dataframe_via_telegram, sync_dataframe_to_sqlite_database, top_n_unique_values, union_join, update_rows
6
6
  from .docs_lib import docs
7
7
  from .interactive_shell_lib import interactive_shell
@@ -744,11 +744,11 @@ def plot_polynomial_functions(
744
744
  show_legend : bool
745
745
  Whether to add a legend to the plot (defaults to True).
746
746
  open_file : bool
747
- If saving to path is not desirable, opens the SVG as a temp file;
748
- otherwise opens the file from the actual location using the system's
747
+ If saving to path is not desirable, opens the SVG as a temp file;
748
+ otherwise opens the file from the actual location using the system's
749
749
  default viewer (defaults to False).
750
750
  save_path : Optional[str]
751
- If specified, saves the output string as a .svg at the indicated path
751
+ If specified, saves the output string as a .svg at the indicated path
752
752
  (defaults to None).
753
753
 
754
754
  Returns
@@ -899,3 +899,166 @@ def plot_polynomial_functions(
899
899
 
900
900
  return svg_string
901
901
 
902
+
903
+ def plot_x_points_of_polynomial_functions(
904
+ functions: List[Dict[str, Dict[str, Any]]],
905
+ zoom: float = 10.0,
906
+ show_legend: bool = True,
907
+ open_file: bool = False,
908
+ save_path: Optional[str] = None,
909
+ ) -> str:
910
+ """
911
+ Plots one or more expressions described by a list of dictionaries. For each
912
+ item in the list, the function evaluates the given Python/NumPy expression
913
+ at the specified x-values (converted to NumPy arrays if they are Python lists)
914
+ and plots the resulting points on a single figure.
915
+
916
+ Parameters
917
+ ----------
918
+ functions : List[Dict[str, Dict[str, Any]]] A list of one or more items,
919
+ each of which has exactly one key-value pair:
920
+ - Key (`str`): A valid Python/NumPy expression (e.g., `x**2`,
921
+ `np.sin(x)`, `x - a`).
922
+ - Value (`Dict[str, Any]`): Must assign `x` a value
923
+ zoom : float, optional
924
+ Determines the numeric axis range from -zoom..+zoom in both x and y
925
+ (default is 10.0).
926
+ show_legend : bool, optional
927
+ Whether to include a legend in the plot (default is True).
928
+ open_file : bool, optional
929
+ If saving to path is not desirable, opens the SVG as a temp file;
930
+ otherwise opens the file from the indicated path using the system's
931
+ default viewer (defaults to False).
932
+ save_path : Optional[str], optional
933
+ If specified, saves the output SVG at the given path (defaults to None).
934
+
935
+ Returns
936
+ -------
937
+ str
938
+ The raw SVG markup of the resulting scatter plot.
939
+
940
+ """
941
+ def latexify_expression(expr_str: str) -> str:
942
+ # Regex to locate np.diff(...) with an optional second argument
943
+ DIFF_PATTERN = r"np\.diff\s*\(\s*([^,\)]+)(?:,\s*(\d+))?\)"
944
+
945
+ def diff_replacer(match: re.Match) -> str:
946
+ inside = match.group(1).strip()
947
+ exponent = match.group(2)
948
+ inside_no_np = inside.replace("np.", "")
949
+ if exponent:
950
+ return rf"\Delta^{exponent}\left({inside_no_np}\right)"
951
+ else:
952
+ return rf"\Delta\left({inside_no_np}\right)"
953
+
954
+ expr_tmp = re.sub(DIFF_PATTERN, diff_replacer, expr_str)
955
+ expr_tmp = expr_tmp.replace("np.", "")
956
+
957
+ # Attempt to convert basic Pythonic polynomial expressions into LaTeX
958
+ try:
959
+ from python_latex_helpers import python_polynomial_expression_to_latex
960
+ latex_expr = python_polynomial_expression_to_latex(expr_tmp)
961
+ return latex_expr
962
+ except Exception:
963
+ # Fallback: naive ** -> ^
964
+ return expr_tmp.replace("**", "^")
965
+
966
+ def handle_open_and_save(svg_string: str, open_it: bool, path: Optional[str]) -> None:
967
+ # Save the SVG to a file if a path is provided
968
+ if path:
969
+ try:
970
+ with open(path, 'w', encoding='utf-8') as file:
971
+ file.write(svg_string)
972
+ print(f"[INFO] SVG saved to: {path}")
973
+ except IOError as e:
974
+ print(f"[ERROR] Failed to save SVG to {path}. IOError: {e}")
975
+
976
+ # Handle opening the file if requested
977
+ if open_it and path:
978
+ result = subprocess.run(["xdg-open", path], stderr=subprocess.DEVNULL)
979
+ if result.returncode != 0:
980
+ print("[ERROR] Failed to open the SVG file with the default viewer.")
981
+ elif open_it:
982
+ with tempfile.NamedTemporaryFile(delete=False, suffix=".svg") as tmpfile:
983
+ temp_svg_path = tmpfile.name
984
+ tmpfile.write(svg_string.encode('utf-8'))
985
+ result = subprocess.run(["xdg-open", temp_svg_path], stderr=subprocess.DEVNULL)
986
+ if result.returncode != 0:
987
+ print("[ERROR] Failed to open the SVG file with the default viewer.")
988
+
989
+ # Set up a buffer for the SVG output
990
+ buffer = BytesIO()
991
+ fig, ax = plt.subplots()
992
+
993
+ # Iterate over each expression-substitution dictionary
994
+ for item in functions:
995
+ # Each entry in 'functions' must have exactly one key-value pair
996
+ if len(item) != 1:
997
+ print("[WARNING] Skipping invalid item. It must have exactly 1 expression->substitutions pair.")
998
+ continue
999
+
1000
+ expression, sub_dict = next(iter(item.items()))
1001
+
1002
+ # Ensure 'x' is present
1003
+ if "x" not in sub_dict:
1004
+ print(f"[WARNING] Skipping '{expression}' because there is no 'x' key.")
1005
+ continue
1006
+
1007
+ x_vals = sub_dict["x"]
1008
+ # Convert to numpy array if needed
1009
+ if not isinstance(x_vals, np.ndarray):
1010
+ x_vals = np.array(x_vals)
1011
+
1012
+ # Evaluate expression with the given variables
1013
+ try:
1014
+ eval_context = {"np": np}
1015
+ eval_context.update(sub_dict) # put all user-provided variables in the context
1016
+ y_vals = eval(expression, {"np": np}, eval_context)
1017
+ except Exception as e:
1018
+ print(f"[ERROR] Could not evaluate expression '{expression}': {e}")
1019
+ continue
1020
+
1021
+ # Convert y-values to a numpy array if needed
1022
+ if not isinstance(y_vals, np.ndarray):
1023
+ y_vals = np.array(y_vals)
1024
+
1025
+ # Prepare label (LaTeXified)
1026
+ label_expr = latexify_expression(expression)
1027
+
1028
+ # Scatter plot
1029
+ ax.scatter(x_vals, y_vals, label=rf"${label_expr}$")
1030
+
1031
+ # Configure axes
1032
+ ax.set_xlim(-zoom, zoom)
1033
+ ax.set_ylim(-zoom, zoom)
1034
+
1035
+ # Place spines at center (optional styling preference)
1036
+ ax.spines['left'].set_position('zero')
1037
+ ax.spines['bottom'].set_position('zero')
1038
+ ax.spines['right'].set_color('none')
1039
+ ax.spines['top'].set_color('none')
1040
+ ax.xaxis.set_ticks_position('bottom')
1041
+ ax.yaxis.set_ticks_position('left')
1042
+ ax.set_aspect('equal', 'box')
1043
+ ax.grid(True)
1044
+
1045
+ # If requested, show the legend
1046
+ if show_legend:
1047
+ leg = ax.legend(
1048
+ loc='upper center',
1049
+ bbox_to_anchor=(0.5, -0.03),
1050
+ fancybox=True,
1051
+ shadow=True,
1052
+ ncol=1
1053
+ )
1054
+ plt.savefig(buffer, format='svg', bbox_inches='tight', bbox_extra_artists=[leg])
1055
+ else:
1056
+ plt.savefig(buffer, format='svg', bbox_inches='tight')
1057
+
1058
+ plt.close(fig)
1059
+ svg_string = buffer.getvalue().decode('utf-8')
1060
+
1061
+ # Optionally open/save the file
1062
+ handle_open_and_save(svg_string, open_file, save_path)
1063
+
1064
+ return svg_string
@@ -1,3 +1,30 @@
1
+ Metadata-Version: 2.2
2
+ Name: rgwfuncs
3
+ Version: 0.0.58
4
+ Summary: A functional programming paradigm for mathematical modelling and data science
5
+ Home-page: https://github.com/ryangerardwilson/rgwfunc
6
+ Author: Ryan Gerard Wilson
7
+ Author-email: Ryan Gerard Wilson <ryangerardwilson@gmail.com>
8
+ Project-URL: Homepage, https://github.com/ryangerardwilson/rgwfuncs
9
+ Project-URL: Issues, https://github.com/ryangerardwilson/rgwfuncs
10
+ Classifier: Programming Language :: Python :: 3
11
+ Classifier: License :: OSI Approved :: MIT License
12
+ Classifier: Operating System :: OS Independent
13
+ Requires-Python: >=3.10
14
+ Description-Content-Type: text/markdown
15
+ License-File: LICENSE
16
+ Requires-Dist: pandas
17
+ Requires-Dist: pymssql
18
+ Requires-Dist: mysql-connector-python
19
+ Requires-Dist: clickhouse-connect
20
+ Requires-Dist: google-cloud-bigquery
21
+ Requires-Dist: google-auth
22
+ Requires-Dist: xgboost
23
+ Requires-Dist: requests
24
+ Requires-Dist: slack-sdk
25
+ Requires-Dist: google-api-python-client
26
+ Requires-Dist: boto3
27
+
1
28
  # RGWFUNCS
2
29
 
3
30
  ***By Ryan Gerard Wilson (https://ryangerardwilson.com)***
@@ -514,19 +541,58 @@ This function plots polynomial functions described by a list of expressions and
514
541
  {"x**2/(2 + a) + a": {"x": np.linspace(-3, 4, 101), "a": 1.23}},
515
542
  {"np.diff(x**3, 2)": {"x": np.linspace(-2, 2, 10)}}
516
543
  ],
517
- zoom=2
544
+ zoom=2,
545
+ open_file=True,
546
+ save_path="plot_polynomial_functions_example_1.svg"
518
547
  )
519
548
 
520
- # Write the SVG to an actual file
521
- with open("plot.svg", "w", encoding="utf-8") as file:
522
- file.write(plot_svg_string)
523
-
524
549
  • Displaying the SVG:
525
550
 
526
551
  ![Plot](./media/plot_polynomial_functions_example_1.svg)
527
552
 
528
553
  --------------------------------------------------------------------------------
529
554
 
555
+ ### 12. `plot_x_points_of_polynomial_functions`
556
+
557
+ This function plots one or more expressions described by a list of dictionaries. For each item in the list, the function evaluates the given Python/NumPy expression at the specified x-values (converted to NumPy arrays if they are Python lists) and plots the resulting points on a single figure.
558
+
559
+ • Parameters:
560
+ - `functions` (`List[Dict[str, Dict[str, Any]]]`): A list of one or more items, each of which has exactly one key-value pair:
561
+ - Key (`str`): A valid Python/NumPy expression (e.g., `x**2`, `np.sin(x)`, `x - a`).
562
+ - Value (`Dict[str, Any]`): Must assign `x` a value
563
+ - `zoom` (`float`): Numeric range from -zoom to +zoom on both x and y axes (default 10.0).
564
+ - `show_legend` (`bool`): If True, includes a legend (default True).
565
+ - `open_file` (bool):
566
+ - If True and `save_path` is given, opens that file with the system viewer.
567
+ - If True and `save_path` is None, writes to a temporary file and opens it (default False).
568
+ - `save_path` (`Optional[str]`): If specified, writes the resulting SVG to this path (default None).
569
+
570
+ • Returns:
571
+ - `str`: The raw SVG markup of the resulting scatter plot.
572
+
573
+ • Example:
574
+
575
+ from rgwfuncs import plot_x_points_of_polynomial_functions
576
+ import numpy as np
577
+
578
+ svg_output = plot_x_points_of_polynomial_functions(
579
+ functions=[
580
+ {"x**2": {"x": np.array([-2, -1, 0, 1, 2])}},
581
+ {"np.sin(x)": {"x": np.linspace(0, 2*np.pi, 5)}},
582
+ {"x - 3": {"x": np.array([-2, 0, 2, 4, 6])}}
583
+ ],
584
+ zoom=6,
585
+ show_legend=True,
586
+ open_file=True,
587
+ save_path="plot_x_points_of_polynomial_functions_example_5.svg"
588
+ )
589
+
590
+ • Displaying the SVG:
591
+
592
+ ![Plot](./media/plot_x_points_of_polynomial_functions_example_5.svg)
593
+
594
+ --------------------------------------------------------------------------------
595
+
530
596
  ## String Based Functions
531
597
 
532
598
  ### 1. send_telegram_message