From 7b209363dd6e8eb4768d3eb2a19e5a607174cbf3 Mon Sep 17 00:00:00 2001 From: Salma Mamdoh <52897508+Salma-Mamdoh@users.noreply.github.com> Date: Mon, 1 Jul 2024 17:49:01 +0300 Subject: [PATCH 1/2] Subplots in Matplotlib --- .../images/Subplots.png | Bin 0 -> 28968 bytes .../images/matplotlib-sub-plots.md | 216 ++++++++++++++++++ contrib/plotting-visualization/index.md | 3 +- .../matplotlib-sub-plot.md | 130 +++++++++++ 4 files changed, 348 insertions(+), 1 deletion(-) create mode 100644 contrib/plotting-visualization/images/Subplots.png create mode 100644 contrib/plotting-visualization/images/matplotlib-sub-plots.md create mode 100644 contrib/plotting-visualization/matplotlib-sub-plot.md diff --git a/contrib/plotting-visualization/images/Subplots.png b/contrib/plotting-visualization/images/Subplots.png new file mode 100644 index 0000000000000000000000000000000000000000..9a9ceb57157d0d96f39043452eda7b2886e2b9c4 GIT binary patch literal 28968 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 Date: Thu, 4 Jul 2024 23:08:05 +0530 Subject: [PATCH 2/2] Delete contrib/plotting-visualization/images/matplotlib-sub-plots.md --- .../images/matplotlib-sub-plots.md | 216 ------------------ 1 file changed, 216 deletions(-) delete mode 100644 contrib/plotting-visualization/images/matplotlib-sub-plots.md diff --git a/contrib/plotting-visualization/images/matplotlib-sub-plots.md b/contrib/plotting-visualization/images/matplotlib-sub-plots.md deleted file mode 100644 index 97d45ce..0000000 --- a/contrib/plotting-visualization/images/matplotlib-sub-plots.md +++ /dev/null @@ -1,216 +0,0 @@ -# Bar Plots in Matplotlib -A bar plot or a bar chart is a type of data visualisation that represents data in the form of rectangular bars, with lengths or heights proportional to the values and data which they represent. The bar plots can be plotted both vertically and horizontally. - -It is one of the most widely used type of data visualisation as it is easy to interpret and is pleasing to the eyes. - -Matplotlib provides a very easy and intuitive method to create highly customized bar plots. - -## Prerequisites - -Before creating bar plots in matplotlib you must ensure that you have Python as well as Matplotlib installed on your system. - -## Creating a simple Bar Plot with `bar()` method - -A very basic Bar Plot can be created with `bar()` method in `matplotlib.pyplot` - -```Python -import matplotlib.pyplot as plt - -# Creating dataset -x = ["A", "B", "C", "D"] -y = [2, 7, 9, 11] - -# Creating bar plot -plt.bar(x,y) -plt.show() # Shows the plot -``` -When executed, this would show the following bar plot: - -![Basic Bar Plot](images/basic_bar_plot.png) - -The `bar()` function takes arguments that describes the layout of the bars. - -Here, `plt.bar(x,y)` is used to specify that the bar chart is to be plotted by taking the `x` array as X-axis and `y` array as Y-axis. You can customize the graph further like adding labels to the axes, color of the bars, etc. These will be explored in the upcoming sections. - -Additionally, you can also use `numpy` arrays for faster generation when handling large datasets. - -```Python -import matplotlib.pyplot as plt -import numpy as np - -# Using numpy array -x = np.array(["A", "B", "C", "D"]) -y = np.array([2, 7, 9, 11]) - -plt.bar(x,y) -plt.show() -``` -Its output would be the same as above. - -## Customizing Bar Plots - -For creating customized bar plots, it is **highly recommended** to create the plots using `matplotlib.pyplot.subplots()`, otherwise it is difficult to apply the customizations in the newer versions of Matplotlib. - -### Adding title to the graph and labeling the axes - -Let us create an imaginary graph of number of cars sold in a various years. - -```Python -import matplotlib.pyplot as plt - -fig, ax = plt.subplots() - -years = ['1999', '2000', '2001', '2002'] -num_of_cars_sold = [300, 500, 700, 1000] - -# Creating bar plot -ax.bar(years, num_of_cars_sold) - -# Adding axis labels -ax.set_xlabel("Years") -ax.set_ylabel("Number of cars sold") - -# Adding plot title -ax.set_title("Number of cars sold in various years") - -plt.show() -``` - -![Title and axis labels](images/title_and_axis_labels.png) - -Here, we have created a `matplotlib.pyplot.subplots()` object which returns a `Figure` object `fig` as well as an `Axes` object `ax` both of which are used for customizing the bar plot. `ax.set_xlabel`, `ax.set_ylabel` and `ax.set_title` are respectively used for adding labels of X, Y axis and adding title to the graph. - -### Adding bar colors and legends - -Let us consider our previous example of number of cars sold in various years and suppose that we want to add different colors to the bars from different centuries and respective legends for better interpretation. - -This can be achieved by creating two separate arrays `bar_colors` for bar colors and `bar_labels` for legend labels and passing them as arguments to parameters color and label respectively in `ax.bar` method. - -```Python -import matplotlib.pyplot as plt - -fig, ax = plt.subplots() - -years = ['1998', '1999', '2000', '2001', '2002'] -num_of_cars_sold = [200, 300, 500, 700, 1000] -bar_colors = ['tab:green', 'tab:green', 'tab:blue', 'tab:blue', 'tab:blue'] -bar_labels = ['1900s', '_1900s', '2000s', '_2000s', '_2000s'] - -# Creating the customized bar plot -ax.bar(years, num_of_cars_sold, color=bar_colors, label=bar_labels) - -# Adding axis labels -ax.set_xlabel("Years") -ax.set_ylabel("Number of cars sold") - -# Adding plot title -ax.set_title("Number of cars sold in various years") - -# Adding legend title -ax.legend(title='Centuries') - -plt.show() -``` - -![Bar colors and Legends](images/bar_colors_and_legends.png) - -Note that the labels with a preceding underscore won't show up in the legend. Legend titles can be added by simply passing `title` argument in `ax.legend()`, as shown. Also, you can have a different color for all the bars by passing the `HEX` value of that color in the `color` parameter. - -### Adding labels to bars - -We may want to add labels to bars representing their absolute (or truncated) values for instant and accurate reading. This can be achieved by passing the `BarContainer` object (returned by `ax.bar()` method) which is basically a aontainer with all the bars and optionally errorbars to `ax.bar_label` method. - -```Python -import matplotlib.pyplot as plt - -fig, ax = plt.subplots() - -years = ['1998', '1999', '2000', '2001', '2002'] -num_of_cars_sold = [200, 300, 500, 700, 1000] -bar_colors = ['tab:green', 'tab:green', 'tab:blue', 'tab:blue', 'tab:blue'] -bar_labels = ['1900s', '_1900s', '2000s', '_2000s', '_2000s'] - -# BarContainer object -bar_container = ax.bar(years, num_of_cars_sold, color=bar_colors, label=bar_labels) - -ax.set_xlabel("Years") -ax.set_ylabel("Number of cars sold") -ax.set_title("Number of cars sold in various years") -ax.legend(title='Centuries') - -# Adding bar labels -ax.bar_label(bar_container) - -plt.show() -``` - -![Bar Labels](images/bar_labels.png) - -**Note:** There are various other methods of adding bar labels in matplotlib. - -## Horizontal Bar Plot - -We can create horizontal bar plots by using the `barh()` method in `matplotlib.pyplot`. All the relevant customizations are applicable here also. - -```Python -import matplotlib.pyplot as plt - -fig, ax = plt.subplots(figsize=(10,5)) # figsize is used to alter the size of figure - -years = ['1998', '1999', '2000', '2001', '2002'] -num_of_cars_sold = [200, 300, 500, 700, 1000] -bar_colors = ['tab:green', 'tab:green', 'tab:blue', 'tab:blue', 'tab:blue'] -bar_labels = ['1900s', '_1900s', '2000s', '_2000s', '_2000s'] - -# Creating horizontal bar plot -bar_container = ax.barh(years, num_of_cars_sold, color=bar_colors, label=bar_labels) - -# Adding axis labels -ax.set_xlabel("Years") -ax.set_ylabel("Number of cars sold") - -# Adding Title -ax.set_title("Number of cars sold in various years") -ax.legend(title='Centuries') - -# Adding bar labels -ax.bar_label(bar_container) - -plt.show() -``` - -![Horizontal Bar Plot-1](images/horizontal_bar_plot_1.png) - -We can also invert the Y-axis labels here to show the top values first. - -```Python -import matplotlib.pyplot as plt - -fig, ax = plt.subplots(figsize=(10,5)) # figsize is used to alter the size of figure - -years = ['1998', '1999', '2000', '2001', '2002'] -num_of_cars_sold = [200, 300, 500, 700, 1000] -bar_colors = ['tab:green', 'tab:green', 'tab:blue', 'tab:blue', 'tab:blue'] -bar_labels = ['1900s', '_1900s', '2000s', '_2000s', '_2000s'] - -# Creating horizontal bar plot -bar_container = ax.barh(years, num_of_cars_sold, color=bar_colors, label=bar_labels) - -# Adding axis labels -ax.set_xlabel("Years") -ax.set_ylabel("Number of cars sold") - -# Adding Title -ax.set_title("Number of cars sold in various years") -ax.legend(title='Centuries') - -# Adding bar labels -ax.bar_label(bar_container) - -# Inverting Y-axis -ax.invert_yaxis() - -plt.show() -``` - -![Horizontal Bar Plot-2](images/horizontal_bar_plot_2.png)