From d0dd9bd3c5a7c5188d3f803a5fd3b6f051a800d3 Mon Sep 17 00:00:00 2001 From: Mamta Wardhani Date: Wed, 21 May 2025 16:08:19 +0530 Subject: [PATCH 01/10] [Edit] SQL: DATEDIFF() --- .../concepts/dates/terms/datediff/datediff.md | 191 ++++++++++++++---- 1 file changed, 154 insertions(+), 37 deletions(-) diff --git a/content/sql/concepts/dates/terms/datediff/datediff.md b/content/sql/concepts/dates/terms/datediff/datediff.md index 66f952e9b2e..9426633b080 100644 --- a/content/sql/concepts/dates/terms/datediff/datediff.md +++ b/content/sql/concepts/dates/terms/datediff/datediff.md @@ -1,72 +1,189 @@ --- Title: 'DATEDIFF()' -Description: 'Calculates and returns the difference between two date values. Available in SQL Server and MySQL.' +Description: 'Calculates the difference between two date or timestamp values and returns the result as an integer.' Subjects: - - 'Data Science' + - 'Computer Science' + - 'Web Development' Tags: - 'Database' - 'Date' - - 'Queries' - - 'MySQL' - - 'SQL Server' + - 'Functions' + - 'SQL' CatalogContent: - 'learn-sql' - 'paths/analyze-data-with-sql' - - 'paths/design-databases-with-postgresql' --- -**`DATEDIFF()`** is a function found in SQL Server and MySQL that calculates and returns the difference between two date values. +The **`DATEDIFF()`** function calculates the difference between two date or timestamp values and returns the result as an integer in a specified unit of time. This powerful function allows developers and analysts to easily measure time intervals between dates, which is essential for reporting, data analysis, and application development. -## SQL Server Syntax +`DATEDIFF()` serves as a cornerstone for date-based calculations in SQL Server, enabling users to perform operations like calculating ages, measuring durations of events, determining time elapsed between transactions, and creating date-based business metrics. Its versatility makes it invaluable for virtually any application that deals with temporal data. + +## Syntax ```pseudo -DATEDIFF(datePart, date1, date2) +DATEDIFF(interval, date1, date2) ``` -The `DATEDIFF()` function in SQL Server has three required parameters: +**Parameters:** + +- `interval`: The time unit in which the difference will be calculated. Valid values include: + - `year`, `yy`, `yyyy`: Years + - `quarter`, `qq`, `q`: Quarters + - `month`, `mm`, `m`: Months + - `dayofyear`, `dy`, `y`: Day of the year + - `day`, `dd`, `d`: Days + - `week`, `wk`, `ww`: Weeks + - `hour`, `hh`: Hours + - `minute`, `mi`, `n`: Minutes + - `second`, `ss`, `s`: Seconds + - `millisecond`, `ms`: Milliseconds + - `microsecond`, `mcs`: Microseconds + - `nanosecond`, `ns`: Nanoseconds +- `date1`: The start date for the calculation. Can be a date, datetime, datetime2, smalldatetime, or time data type, or an expression that resolves to one of these types. +- `date2`: The end date for the calculation. Can be a date, datetime, datetime2, smalldatetime, or time data type, or an expression that resolves to one of these types. + +**Return value:** -- `datePart` is the part of the date to return. It can be one of the following formats: - - Year: `year`, `yyyy`, `yy` - - Quarter: `quarter`, `qq`, `q` - - Week: `week`, `ww`, `wk` - - Weekday: `weekday`, `dw`, `w` - - Second: `second`, `ss`, `s` - - Month: `month`, `mm`, `m` - - Minute: `minute`, `mi`, `n` - - Millisecond: `millisecond`, `ms` - - Hour: `hour`, `hh` - - Day of Year: `dayofyear` - - Day: `day`, `dy`, `y` -- `date1` and `date2` are the dates to compare. It can be in several formats, one being the `yyyy/mm/dd` format. +The `DATEDIFF()` function returns an integer representing the number of time units (specified by the interval parameter) between date1 and date2. -### Example 1 +## Example 1: Basic Date Difference Calculation -The following example calculates the difference in months between `2020/05/18` and `2022/05/18`: +This example demonstrates how to calculate the difference between two dates in various time intervals: ```sql -SELECT DATEDIFF(month, '2020/05/18', '2022/05/18'); /* Output: 24 */ +-- Calculate difference between two dates in years, months, and days +SELECT + DATEDIFF(year, '2020-01-15', '2023-09-20') AS YearDiff, + DATEDIFF(month, '2020-01-15', '2023-09-20') AS MonthDiff, + DATEDIFF(day, '2020-01-15', '2023-09-20') AS DayDiff; ``` -### Example 2 +Output produced by this code will be: + +| YearDiff | MonthDiff | DayDiff | +| -------- | --------- | ------- | +| 3 | 44 | 1344 | + +This example calculates the difference between January 15, 2020, and September 20, 2023, in years, months, and days. The results show there are 3 years, 44 months, or 1344 days between these dates. + +## Example 2: Calculating Age in Years -The following example returns the difference in seconds between `2021/09/30 08:22:04` and `2021/09/30 08:25:06`: +This example demonstrates how to use `DATEDIFF()` to calculate a person's age in years from their birthdate. ```sql -SELECT DATEDIFF(second, '2021/09/30 08:22:04', '2021/09/30 08:25:06'); /* Output: 182 */ +-- Create a sample table with employee data +CREATE TABLE Employees ( + EmployeeID INT PRIMARY KEY, + FirstName VARCHAR(50), + LastName VARCHAR(50), + BirthDate DATE, + HireDate DATE +); + +-- Insert sample data +INSERT INTO Employees (EmployeeID, FirstName, LastName, BirthDate, HireDate) +VALUES + (1, 'John', 'Smith', '1985-06-15', '2010-03-20'), + (2, 'Sarah', 'Johnson', '1992-11-30', '2015-07-10'), + (3, 'Michael', 'Brown', '1978-02-23', '2005-09-15'); + +-- Calculate ages as of current date +SELECT + EmployeeID, + FirstName + ' ' + LastName AS EmployeeName, + BirthDate, + DATEDIFF(year, BirthDate, GETDATE()) AS Age +FROM + Employees +ORDER BY + Age DESC; ``` -## MySQL Syntax +The output generated by this code will be: -MySQL only requires two date parameters in the `DATEDIFF()` function and will return the number of days between `date1` and `date2`. +| EmployeeID | EmployeeName | BirthDate | Age | +| ---------- | ------------- | ---------- | --- | +| 3 | Michael Brown | 1978-02-23 | 47 | +| 1 | John Smith | 1985-06-15 | 39 | +| 2 | Sarah Johnson | 1992-11-30 | 32 | -```pseudo -DATEDIFF(date1, date2) -``` +This example shows how to calculate an employee's age by finding the difference in years between their birthdate and the current date. Note that this calculation provides the raw year difference and doesn't account for whether the birthday has occurred yet in the current year. -### Example +## Example 3: Business Metrics with `DATEDIFF()` -The following example returns the difference in days between `2019-07-05` and `2018-12-24`: +This example demonstrates how to use `DATEDIFF()` for business reporting metrics, such as calculating order processing times and identifying delayed shipments. ```sql -SELECT DATEDIFF("2019-07-05", "2018-12-24"); /* Output: 193 */ +-- Create sample orders table +CREATE TABLE Orders ( + OrderID INT PRIMARY KEY, + CustomerID INT, + OrderDate DATETIME, + ShipDate DATETIME, + DeliveryDate DATETIME +); + +-- Insert sample data +INSERT INTO Orders (OrderID, CustomerID, OrderDate, ShipDate, DeliveryDate) +VALUES + (1001, 101, '2023-01-10 09:30:00', '2023-01-11 14:15:00', '2023-01-15 11:20:00'), + (1002, 102, '2023-01-12 13:45:00', '2023-01-13 10:30:00', '2023-01-14 16:45:00'), + (1003, 103, '2023-01-15 11:20:00', '2023-01-18 09:45:00', '2023-01-22 13:10:00'), + (1004, 104, '2023-01-16 14:55:00', '2023-01-17 16:30:00', '2023-01-21 09:30:00'), + (1005, 105, '2023-01-18 10:15:00', NULL, NULL); + +-- Calculate processing, shipping, and total handling times +SELECT + OrderID, + OrderDate, + ShipDate, + DeliveryDate, + -- Processing time (from order to shipment) + DATEDIFF(hour, OrderDate, ShipDate) AS ProcessingHours, + -- Shipping time (from shipment to delivery) + DATEDIFF(day, ShipDate, DeliveryDate) AS ShippingDays, + -- Total time (from order to delivery) + DATEDIFF(day, OrderDate, DeliveryDate) AS TotalDays, + -- Identify delayed shipments (processing > 24 hours) + CASE + WHEN DATEDIFF(hour, OrderDate, ShipDate) > 24 THEN 'Delayed' + ELSE 'On Time' + END AS ShipmentStatus +FROM + Orders +WHERE + ShipDate IS NOT NULL; ``` + +The output of this code will be: + +| OrderID | OrderDate | ShipDate | DeliveryDate | ProcessingHours | ShippingDays | TotalDays | ShipmentStatus | +| ------- | ------------------- | ------------------- | ------------------- | --------------- | ------------ | --------- | -------------- | +| 1001 | 2023-01-10 09:30:00 | 2023-01-11 14:15:00 | 2023-01-15 11:20:00 | 29 | 4 | 5 | Delayed | +| 1002 | 2023-01-12 13:45:00 | 2023-01-13 10:30:00 | 2023-01-14 16:45:00 | 21 | 1 | 2 | On Time | +| 1003 | 2023-01-15 11:20:00 | 2023-01-18 09:45:00 | 2023-01-22 13:10:00 | 70 | 4 | 7 | Delayed | +| 1004 | 2023-01-16 14:55:00 | 2023-01-17 16:30:00 | 2023-01-21 09:30:00 | 26 | 4 | 5 | Delayed | + +This example demonstrates how `DATEDIFF()` can be used to calculate important business metrics for order processing. The query calculates the processing time in hours, shipping time in days, and total handling time in days. It also identifies delayed shipments based on processing times exceeding 24 hours. + +## Frequently Asked Questions + +### 1. How to calculate date difference between two dates in SQL? + +In SQL Server, use the `DATEDIFF()` function with an appropriate interval parameter like day, month, or year. For example, `DATEDIFF(day, '2023-01-01', '2023-01-15')` will return 14 days. + +### 2. Does `DATEDIFF()` include both the start and end dates in its calculation? + +`DATEDIFF()` counts the number of interval boundaries crossed between the two dates. For example, when using 'day', it counts the number of midnight boundaries crossed, not the full 24-hour periods. + +### 3. Why does `DATEDIFF(year, '2022-12-31', '2023-01-01')` return 1 even though it's just one day apart? + +Because `DATEDIFF()` counts calendar boundaries, not complete intervals. Since the dates span across a year boundary, it returns 1 year, even though the difference is only one day. + +### 4. Does `DATEDIFF()` take time zones into account? + +No, SQL Server's `DATEDIFF()` does not account for time zones or daylight saving time transitions. All calculations are done in the server's local time zone. + +### 5. Can I use `DATEDIFF()` with time-only values? + +Yes, you can use time data types with `DATEDIFF()`, but only with time-related intervals like second, minute, and hour. Using day or larger intervals with time-only values will always return 0. From 9f5c19b395cbdcf9e0abd067a634bc9778ddb33c Mon Sep 17 00:00:00 2001 From: Mamta Wardhani Date: Wed, 21 May 2025 16:09:54 +0530 Subject: [PATCH 02/10] Update datediff.md --- .../concepts/dates/terms/datediff/datediff.md | 191 ++++-------------- 1 file changed, 37 insertions(+), 154 deletions(-) diff --git a/content/sql/concepts/dates/terms/datediff/datediff.md b/content/sql/concepts/dates/terms/datediff/datediff.md index 9426633b080..66f952e9b2e 100644 --- a/content/sql/concepts/dates/terms/datediff/datediff.md +++ b/content/sql/concepts/dates/terms/datediff/datediff.md @@ -1,189 +1,72 @@ --- Title: 'DATEDIFF()' -Description: 'Calculates the difference between two date or timestamp values and returns the result as an integer.' +Description: 'Calculates and returns the difference between two date values. Available in SQL Server and MySQL.' Subjects: - - 'Computer Science' - - 'Web Development' + - 'Data Science' Tags: - 'Database' - 'Date' - - 'Functions' - - 'SQL' + - 'Queries' + - 'MySQL' + - 'SQL Server' CatalogContent: - 'learn-sql' - 'paths/analyze-data-with-sql' + - 'paths/design-databases-with-postgresql' --- -The **`DATEDIFF()`** function calculates the difference between two date or timestamp values and returns the result as an integer in a specified unit of time. This powerful function allows developers and analysts to easily measure time intervals between dates, which is essential for reporting, data analysis, and application development. +**`DATEDIFF()`** is a function found in SQL Server and MySQL that calculates and returns the difference between two date values. -`DATEDIFF()` serves as a cornerstone for date-based calculations in SQL Server, enabling users to perform operations like calculating ages, measuring durations of events, determining time elapsed between transactions, and creating date-based business metrics. Its versatility makes it invaluable for virtually any application that deals with temporal data. - -## Syntax +## SQL Server Syntax ```pseudo -DATEDIFF(interval, date1, date2) +DATEDIFF(datePart, date1, date2) ``` -**Parameters:** - -- `interval`: The time unit in which the difference will be calculated. Valid values include: - - `year`, `yy`, `yyyy`: Years - - `quarter`, `qq`, `q`: Quarters - - `month`, `mm`, `m`: Months - - `dayofyear`, `dy`, `y`: Day of the year - - `day`, `dd`, `d`: Days - - `week`, `wk`, `ww`: Weeks - - `hour`, `hh`: Hours - - `minute`, `mi`, `n`: Minutes - - `second`, `ss`, `s`: Seconds - - `millisecond`, `ms`: Milliseconds - - `microsecond`, `mcs`: Microseconds - - `nanosecond`, `ns`: Nanoseconds -- `date1`: The start date for the calculation. Can be a date, datetime, datetime2, smalldatetime, or time data type, or an expression that resolves to one of these types. -- `date2`: The end date for the calculation. Can be a date, datetime, datetime2, smalldatetime, or time data type, or an expression that resolves to one of these types. - -**Return value:** +The `DATEDIFF()` function in SQL Server has three required parameters: -The `DATEDIFF()` function returns an integer representing the number of time units (specified by the interval parameter) between date1 and date2. +- `datePart` is the part of the date to return. It can be one of the following formats: + - Year: `year`, `yyyy`, `yy` + - Quarter: `quarter`, `qq`, `q` + - Week: `week`, `ww`, `wk` + - Weekday: `weekday`, `dw`, `w` + - Second: `second`, `ss`, `s` + - Month: `month`, `mm`, `m` + - Minute: `minute`, `mi`, `n` + - Millisecond: `millisecond`, `ms` + - Hour: `hour`, `hh` + - Day of Year: `dayofyear` + - Day: `day`, `dy`, `y` +- `date1` and `date2` are the dates to compare. It can be in several formats, one being the `yyyy/mm/dd` format. -## Example 1: Basic Date Difference Calculation +### Example 1 -This example demonstrates how to calculate the difference between two dates in various time intervals: +The following example calculates the difference in months between `2020/05/18` and `2022/05/18`: ```sql --- Calculate difference between two dates in years, months, and days -SELECT - DATEDIFF(year, '2020-01-15', '2023-09-20') AS YearDiff, - DATEDIFF(month, '2020-01-15', '2023-09-20') AS MonthDiff, - DATEDIFF(day, '2020-01-15', '2023-09-20') AS DayDiff; +SELECT DATEDIFF(month, '2020/05/18', '2022/05/18'); /* Output: 24 */ ``` -Output produced by this code will be: - -| YearDiff | MonthDiff | DayDiff | -| -------- | --------- | ------- | -| 3 | 44 | 1344 | - -This example calculates the difference between January 15, 2020, and September 20, 2023, in years, months, and days. The results show there are 3 years, 44 months, or 1344 days between these dates. - -## Example 2: Calculating Age in Years +### Example 2 -This example demonstrates how to use `DATEDIFF()` to calculate a person's age in years from their birthdate. +The following example returns the difference in seconds between `2021/09/30 08:22:04` and `2021/09/30 08:25:06`: ```sql --- Create a sample table with employee data -CREATE TABLE Employees ( - EmployeeID INT PRIMARY KEY, - FirstName VARCHAR(50), - LastName VARCHAR(50), - BirthDate DATE, - HireDate DATE -); - --- Insert sample data -INSERT INTO Employees (EmployeeID, FirstName, LastName, BirthDate, HireDate) -VALUES - (1, 'John', 'Smith', '1985-06-15', '2010-03-20'), - (2, 'Sarah', 'Johnson', '1992-11-30', '2015-07-10'), - (3, 'Michael', 'Brown', '1978-02-23', '2005-09-15'); - --- Calculate ages as of current date -SELECT - EmployeeID, - FirstName + ' ' + LastName AS EmployeeName, - BirthDate, - DATEDIFF(year, BirthDate, GETDATE()) AS Age -FROM - Employees -ORDER BY - Age DESC; +SELECT DATEDIFF(second, '2021/09/30 08:22:04', '2021/09/30 08:25:06'); /* Output: 182 */ ``` -The output generated by this code will be: +## MySQL Syntax -| EmployeeID | EmployeeName | BirthDate | Age | -| ---------- | ------------- | ---------- | --- | -| 3 | Michael Brown | 1978-02-23 | 47 | -| 1 | John Smith | 1985-06-15 | 39 | -| 2 | Sarah Johnson | 1992-11-30 | 32 | +MySQL only requires two date parameters in the `DATEDIFF()` function and will return the number of days between `date1` and `date2`. -This example shows how to calculate an employee's age by finding the difference in years between their birthdate and the current date. Note that this calculation provides the raw year difference and doesn't account for whether the birthday has occurred yet in the current year. +```pseudo +DATEDIFF(date1, date2) +``` -## Example 3: Business Metrics with `DATEDIFF()` +### Example -This example demonstrates how to use `DATEDIFF()` for business reporting metrics, such as calculating order processing times and identifying delayed shipments. +The following example returns the difference in days between `2019-07-05` and `2018-12-24`: ```sql --- Create sample orders table -CREATE TABLE Orders ( - OrderID INT PRIMARY KEY, - CustomerID INT, - OrderDate DATETIME, - ShipDate DATETIME, - DeliveryDate DATETIME -); - --- Insert sample data -INSERT INTO Orders (OrderID, CustomerID, OrderDate, ShipDate, DeliveryDate) -VALUES - (1001, 101, '2023-01-10 09:30:00', '2023-01-11 14:15:00', '2023-01-15 11:20:00'), - (1002, 102, '2023-01-12 13:45:00', '2023-01-13 10:30:00', '2023-01-14 16:45:00'), - (1003, 103, '2023-01-15 11:20:00', '2023-01-18 09:45:00', '2023-01-22 13:10:00'), - (1004, 104, '2023-01-16 14:55:00', '2023-01-17 16:30:00', '2023-01-21 09:30:00'), - (1005, 105, '2023-01-18 10:15:00', NULL, NULL); - --- Calculate processing, shipping, and total handling times -SELECT - OrderID, - OrderDate, - ShipDate, - DeliveryDate, - -- Processing time (from order to shipment) - DATEDIFF(hour, OrderDate, ShipDate) AS ProcessingHours, - -- Shipping time (from shipment to delivery) - DATEDIFF(day, ShipDate, DeliveryDate) AS ShippingDays, - -- Total time (from order to delivery) - DATEDIFF(day, OrderDate, DeliveryDate) AS TotalDays, - -- Identify delayed shipments (processing > 24 hours) - CASE - WHEN DATEDIFF(hour, OrderDate, ShipDate) > 24 THEN 'Delayed' - ELSE 'On Time' - END AS ShipmentStatus -FROM - Orders -WHERE - ShipDate IS NOT NULL; +SELECT DATEDIFF("2019-07-05", "2018-12-24"); /* Output: 193 */ ``` - -The output of this code will be: - -| OrderID | OrderDate | ShipDate | DeliveryDate | ProcessingHours | ShippingDays | TotalDays | ShipmentStatus | -| ------- | ------------------- | ------------------- | ------------------- | --------------- | ------------ | --------- | -------------- | -| 1001 | 2023-01-10 09:30:00 | 2023-01-11 14:15:00 | 2023-01-15 11:20:00 | 29 | 4 | 5 | Delayed | -| 1002 | 2023-01-12 13:45:00 | 2023-01-13 10:30:00 | 2023-01-14 16:45:00 | 21 | 1 | 2 | On Time | -| 1003 | 2023-01-15 11:20:00 | 2023-01-18 09:45:00 | 2023-01-22 13:10:00 | 70 | 4 | 7 | Delayed | -| 1004 | 2023-01-16 14:55:00 | 2023-01-17 16:30:00 | 2023-01-21 09:30:00 | 26 | 4 | 5 | Delayed | - -This example demonstrates how `DATEDIFF()` can be used to calculate important business metrics for order processing. The query calculates the processing time in hours, shipping time in days, and total handling time in days. It also identifies delayed shipments based on processing times exceeding 24 hours. - -## Frequently Asked Questions - -### 1. How to calculate date difference between two dates in SQL? - -In SQL Server, use the `DATEDIFF()` function with an appropriate interval parameter like day, month, or year. For example, `DATEDIFF(day, '2023-01-01', '2023-01-15')` will return 14 days. - -### 2. Does `DATEDIFF()` include both the start and end dates in its calculation? - -`DATEDIFF()` counts the number of interval boundaries crossed between the two dates. For example, when using 'day', it counts the number of midnight boundaries crossed, not the full 24-hour periods. - -### 3. Why does `DATEDIFF(year, '2022-12-31', '2023-01-01')` return 1 even though it's just one day apart? - -Because `DATEDIFF()` counts calendar boundaries, not complete intervals. Since the dates span across a year boundary, it returns 1 year, even though the difference is only one day. - -### 4. Does `DATEDIFF()` take time zones into account? - -No, SQL Server's `DATEDIFF()` does not account for time zones or daylight saving time transitions. All calculations are done in the server's local time zone. - -### 5. Can I use `DATEDIFF()` with time-only values? - -Yes, you can use time data types with `DATEDIFF()`, but only with time-related intervals like second, minute, and hour. Using day or larger intervals with time-only values will always return 0. From 527fdb667a92ab0f931b53752cc50eb6304d7e7b Mon Sep 17 00:00:00 2001 From: Mamta Wardhani Date: Fri, 23 May 2025 16:37:39 +0530 Subject: [PATCH 03/10] [Edit] Matplotlib - Python: PyPlot --- content/matplotlib/concepts/pyplot/pyplot.md | 128 ++++++++++++++++++- 1 file changed, 121 insertions(+), 7 deletions(-) diff --git a/content/matplotlib/concepts/pyplot/pyplot.md b/content/matplotlib/concepts/pyplot/pyplot.md index e934071d591..2c603e682a7 100644 --- a/content/matplotlib/concepts/pyplot/pyplot.md +++ b/content/matplotlib/concepts/pyplot/pyplot.md @@ -1,24 +1,138 @@ --- Title: 'pyplot' -Description: 'The pyplot module provides the interface for creating figures and plotting data points in Matplotlib.' +Description: 'Provides a MATLAB-like interface for creating plots and visualizations in Python using matplotlib.' Subjects: + - 'Computer Science' - 'Data Science' - - 'Data Visualization' Tags: - 'Graphs' - - 'Libraries' - 'Matplotlib' + - 'Python' CatalogContent: - 'learn-python-3' - - 'paths/computer-science' + - 'paths/data-science' --- -In Matplotlib, the **`pyplot`** module provides the interface for creating figures for plotting data points on the screen. +**`pyplot`** is a state-based interface module in the matplotlib library that provides a MATLAB-like way of plotting in Python. It serves as the primary entry point for creating plots and visualizations by offering a collection of functions that make changes to a figure, such as creating a figure, creating a plotting area in a figure, plotting lines, decorating the plot with labels, and more. The module maintains an internal state that tracks the current figure and axes, allowing users to build plots incrementally without explicitly managing figure objects. + +`pyplot` is widely used in data science, scientific computing, academic research, and business analytics for creating static, animated, and interactive visualizations. It's particularly popular for exploratory data analysis, creating publication-quality plots, generating reports with embedded charts, and building dashboards. The module's simple syntax makes it ideal for quick plotting tasks, prototyping visualizations, and educational purposes where users need to create plots with minimal code. ## Syntax -```pseudo +`pyplot` does not have a single syntax since it's a collection of plotting functions. Instead, here are the essential steps to create plots using pyplot: + +1. **Import the module**: `import matplotlib.pyplot as plt` +2. **Prepare data**: Create or load the data to be plotted +3. **Create plot**: Use plotting functions like `plt.plot()`, [`plt.scatter()`](https://www.codecademy.com/resources/docs/matplotlib/pyplot/scatter), [`plt.bar()`](https://www.w3schools.com/python/matplotlib_pyplot.asp), etc. +4. **Customize plot**: Add labels, titles, legends using functions like `plt.xlabel()`, `plt.title()`, `plt.legend()` +5. **Display plot**: Use `plt.show()` to display the plot or `plt.savefig()` to save it + +Common pyplot functions include: + +- `plt.plot()`: Creates line plots and scatter plots +- `plt.bar()`: Creates bar charts +- [`plt.hist()`](https://www.codecademy.com/resources/docs/matplotlib/pyplot/hist): Creates histograms +- `plt.scatter()`: Creates scatter plots +- `plt.xlabel()`: Sets x-axis label +- `plt.ylabel()`: Sets y-axis label +- `plt.title()`: Sets plot title +- [`plt.legend()`](https://www.codecademy.com/resources/docs/matplotlib/pyplot/legend): Adds legend to the plot +- `plt.show()`: Displays the plot +- `plt.savefig()`: Saves the plot to a file + +`pyplot` functions typically modify the current figure and axes, and most functions return the created objects for further customization. + +## Example 1: Basic Line Plot using `pyplot` + +This example demonstrates the fundamental usage of pyplot to create a simple line plot, which is the most common starting point for data visualization: + +```py import matplotlib.pyplot as plt +import numpy as np + +# Create sample data +x = np.array([1, 2, 3, 4, 5]) # X-axis values +y = np.array([2, 4, 6, 8, 10]) # Y-axis values + +# Create a line plot +plt.plot(x, y) + +# Add labels and title +plt.xlabel('X Values') +plt.ylabel('Y Values') +plt.title('Basic Line Plot') + +# Display the plot +plt.show() ``` -The `pyplot` module is made available in an `import` statement and usually under an alias like `plt`. +The output of this code will be: + +![A simple line plot showing five points connected with a straight line, labeled with 'X Values' on the x-axis and 'Y Values' on the y-axis, with the title 'Basic Line Plot'](https://raw.githubusercontent.com/Codecademy/docs/main/media/pyplot-output-1.png) + +This example creates a simple line plot connecting five points. The `plt.plot()` function takes the x and y coordinates and draws a line connecting them. The `plt.xlabel()`, `plt.ylabel()`, and `plt.title()` functions add descriptive labels to make the plot more informative and professional-looking. + +## Example 2: Sales Data Visualization + +This example shows how pyplot can be used to visualize real-world business data, specifically monthly sales figures for analysis and reporting. + +```py +import matplotlib.pyplot as plt +import numpy as np + +# Monthly sales data for a retail store +months = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun'] +sales = [15000, 18000, 22000, 19000, 25000, 28000] # Sales in dollars + +# Create a bar chart for better categorical data representation +plt.bar(months, sales, color='skyblue', edgecolor='navy') + +# Customize the plot for professional presentation +plt.xlabel('Month') +plt.ylabel('Sales ($)') +plt.title('Monthly Sales Performance - Q1 & Q2 2024') + +# Add value labels on top of each bar +for i, v in enumerate(sales): + plt.text(i, v + 500, f'${v:,}', ha='center', fontweight='bold') + +# Rotate x-axis labels for better readability +plt.xticks(rotation=45) + +# Add grid for easier value reading +plt.grid(axis='y', alpha=0.3) + +# Adjust layout to prevent label cutoff +plt.tight_layout() + +# Display the plot +plt.show() +``` + +The output of this code will be: + +![A vertical bar chart showing monthly sales data from January to June, with bars in sky blue and edge outlines in navy. Each bar has a dollar value label above it. The chart is titled 'Monthly Sales Performance – Q1 & Q2 2024', with x-axis labeled 'Month' and y-axis labeled 'Sales ($)'](https://raw.githubusercontent.com/Codecademy/docs/main/media/pyplot-output-2.png) + +This example demonstrates practical business use of pyplot for sales analysis. It creates a professional-looking bar chart with customized colors, value labels, grid lines, and proper formatting. The `plt.tight_layout()` function ensures all elements fit properly within the figure boundaries. + +## Frequently Asked Questions + +### 1. What is the difference between `pyplot` and `matplotlib`? + +`matplotlib` is the entire plotting library, while `pyplot` is a specific module within matplotlib that provides a MATLAB-like interface. `pyplot` is the most commonly used part of `matplotlib` for creating quick plots and interactive visualizations. + +### 2. Do I need to call `plt.show()` every time? + +Yes, `plt.show()` is required to display plots in most environments. However, in Jupyter notebooks, plots may display automatically, and when saving plots with `plt.savefig()`, you don't need `plt.show()` unless you also want to display the plot. + +### 3. Can I create multiple plots in one script? + +Yes, you can create multiple separate plots by calling `plt.figure()` before each new plot, or create subplots within a single figure using `plt.subplot()` or `plt.subplots()`. + +### 4. How do I save plots instead of displaying them? + +Use `plt.savefig('filename.png')` before `plt.show()`. You can save in various formats including PNG, PDF, SVG, and JPEG by changing the file extension. + +### 5. Is pyplot suitable for complex, multi-panel figures? + +While pyplot can handle complex figures, the object-oriented matplotlib API is recommended for complex, multi-panel figures as it provides more control and is easier to manage programmatically. From 9731d5e2ae1d2ad8b8d0400bb627bd61988bd68d Mon Sep 17 00:00:00 2001 From: Mamta Wardhani Date: Fri, 23 May 2025 16:38:10 +0530 Subject: [PATCH 04/10] Add files via upload --- media/pyplot-output-1.png | Bin 0 -> 21317 bytes media/pyplot-output-2.png | Bin 0 -> 32595 bytes 2 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 media/pyplot-output-1.png create mode 100644 media/pyplot-output-2.png diff --git a/media/pyplot-output-1.png b/media/pyplot-output-1.png new file mode 100644 index 0000000000000000000000000000000000000000..259b030603a66aa7ec824ef57820fd8badaad328 GIT binary patch literal 21317 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 YsPK_ePy2c3Xo->#c_^HD@9B&G0};_rP5=M^ literal 0 HcmV?d00001 diff --git a/media/pyplot-output-2.png b/media/pyplot-output-2.png new file mode 100644 index 0000000000000000000000000000000000000000..b3d287dfcfd5e633195c7ea7e6acfbc6838cf4d3 GIT binary patch literal 32595 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 literal 0 HcmV?d00001 From bc2bcdbcda6a319cac2a9863905db8ca35f757fc Mon Sep 17 00:00:00 2001 From: Avdhoot <50920321+avdhoottt@users.noreply.github.com> Date: Thu, 29 May 2025 15:44:25 +0530 Subject: [PATCH 05/10] Update content/matplotlib/concepts/pyplot/pyplot.md --- content/matplotlib/concepts/pyplot/pyplot.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/content/matplotlib/concepts/pyplot/pyplot.md b/content/matplotlib/concepts/pyplot/pyplot.md index 2c603e682a7..fb20987c516 100644 --- a/content/matplotlib/concepts/pyplot/pyplot.md +++ b/content/matplotlib/concepts/pyplot/pyplot.md @@ -30,9 +30,9 @@ CatalogContent: Common pyplot functions include: - `plt.plot()`: Creates line plots and scatter plots -- `plt.bar()`: Creates bar charts +- [`plt.bar()`](https://www.codecademy.com/resources/docs/matplotlib/pyplot/bar): Creates bar charts - [`plt.hist()`](https://www.codecademy.com/resources/docs/matplotlib/pyplot/hist): Creates histograms -- `plt.scatter()`: Creates scatter plots +- [`plt.scatter()`](https://www.codecademy.com/resources/docs/matplotlib/pyplot/scatter): Creates scatter plots - `plt.xlabel()`: Sets x-axis label - `plt.ylabel()`: Sets y-axis label - `plt.title()`: Sets plot title From 4b179626b3a1d5d3ad1f660da35c38323da6aafe Mon Sep 17 00:00:00 2001 From: Avdhoot <50920321+avdhoottt@users.noreply.github.com> Date: Thu, 29 May 2025 15:45:30 +0530 Subject: [PATCH 06/10] Update content/matplotlib/concepts/pyplot/pyplot.md --- content/matplotlib/concepts/pyplot/pyplot.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/content/matplotlib/concepts/pyplot/pyplot.md b/content/matplotlib/concepts/pyplot/pyplot.md index fb20987c516..6e90f8ff5cd 100644 --- a/content/matplotlib/concepts/pyplot/pyplot.md +++ b/content/matplotlib/concepts/pyplot/pyplot.md @@ -44,7 +44,7 @@ Common pyplot functions include: ## Example 1: Basic Line Plot using `pyplot` -This example demonstrates the fundamental usage of pyplot to create a simple line plot, which is the most common starting point for data visualization: +This example demonstrates the fundamental usage of `pyplot` to create a simple line plot, which is the most common starting point for data visualization: ```py import matplotlib.pyplot as plt From 5d82012ef9f1b34cb3f736b81793a8085e1f9bb5 Mon Sep 17 00:00:00 2001 From: Avdhoot <50920321+avdhoottt@users.noreply.github.com> Date: Thu, 29 May 2025 15:47:12 +0530 Subject: [PATCH 07/10] Update content/matplotlib/concepts/pyplot/pyplot.md --- content/matplotlib/concepts/pyplot/pyplot.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/content/matplotlib/concepts/pyplot/pyplot.md b/content/matplotlib/concepts/pyplot/pyplot.md index 6e90f8ff5cd..7d21f6ae348 100644 --- a/content/matplotlib/concepts/pyplot/pyplot.md +++ b/content/matplotlib/concepts/pyplot/pyplot.md @@ -113,7 +113,7 @@ The output of this code will be: ![A vertical bar chart showing monthly sales data from January to June, with bars in sky blue and edge outlines in navy. Each bar has a dollar value label above it. The chart is titled 'Monthly Sales Performance – Q1 & Q2 2024', with x-axis labeled 'Month' and y-axis labeled 'Sales ($)'](https://raw.githubusercontent.com/Codecademy/docs/main/media/pyplot-output-2.png) -This example demonstrates practical business use of pyplot for sales analysis. It creates a professional-looking bar chart with customized colors, value labels, grid lines, and proper formatting. The `plt.tight_layout()` function ensures all elements fit properly within the figure boundaries. +This example demonstrates the practical business use of pyplot for sales analysis. It creates a professional-looking bar chart with customized colors, value labels, grid lines, and proper formatting. The `plt.tight_layout()` function ensures all elements fit properly within the figure boundaries. ## Frequently Asked Questions From 4ca61946e7075b3aa664dc6fa2fff1958851c5a7 Mon Sep 17 00:00:00 2001 From: Avdhoot <50920321+avdhoottt@users.noreply.github.com> Date: Thu, 29 May 2025 15:48:26 +0530 Subject: [PATCH 08/10] Update content/matplotlib/concepts/pyplot/pyplot.md --- content/matplotlib/concepts/pyplot/pyplot.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/content/matplotlib/concepts/pyplot/pyplot.md b/content/matplotlib/concepts/pyplot/pyplot.md index 7d21f6ae348..17dfe7011ec 100644 --- a/content/matplotlib/concepts/pyplot/pyplot.md +++ b/content/matplotlib/concepts/pyplot/pyplot.md @@ -119,7 +119,7 @@ This example demonstrates the practical business use of pyplot for sales analysi ### 1. What is the difference between `pyplot` and `matplotlib`? -`matplotlib` is the entire plotting library, while `pyplot` is a specific module within matplotlib that provides a MATLAB-like interface. `pyplot` is the most commonly used part of `matplotlib` for creating quick plots and interactive visualizations. +The `matplotlib` is the entire plotting library, while `pyplot` is a specific module within matplotlib that provides a MATLAB-like interface. `pyplot` is the most commonly used part of `matplotlib` for creating quick plots and interactive visualizations. ### 2. Do I need to call `plt.show()` every time? @@ -131,7 +131,7 @@ Yes, you can create multiple separate plots by calling `plt.figure()` before eac ### 4. How do I save plots instead of displaying them? -Use `plt.savefig('filename.png')` before `plt.show()`. You can save in various formats including PNG, PDF, SVG, and JPEG by changing the file extension. +Use `plt.savefig('filename.png')` before `plt.show()`. You can save in various formats, including PNG, PDF, SVG, and JPEG, by changing the file extension. ### 5. Is pyplot suitable for complex, multi-panel figures? From 372756e498e5dc66f599c4c45bc2b660febf5ac1 Mon Sep 17 00:00:00 2001 From: Avdhoot <50920321+avdhoottt@users.noreply.github.com> Date: Thu, 29 May 2025 15:49:53 +0530 Subject: [PATCH 09/10] Update content/matplotlib/concepts/pyplot/pyplot.md --- content/matplotlib/concepts/pyplot/pyplot.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/content/matplotlib/concepts/pyplot/pyplot.md b/content/matplotlib/concepts/pyplot/pyplot.md index 17dfe7011ec..64a3d68ce9e 100644 --- a/content/matplotlib/concepts/pyplot/pyplot.md +++ b/content/matplotlib/concepts/pyplot/pyplot.md @@ -13,7 +13,7 @@ CatalogContent: - 'paths/data-science' --- -**`pyplot`** is a state-based interface module in the matplotlib library that provides a MATLAB-like way of plotting in Python. It serves as the primary entry point for creating plots and visualizations by offering a collection of functions that make changes to a figure, such as creating a figure, creating a plotting area in a figure, plotting lines, decorating the plot with labels, and more. The module maintains an internal state that tracks the current figure and axes, allowing users to build plots incrementally without explicitly managing figure objects. +The **`pyplot`** is a state-based interface module in the matplotlib library that provides a MATLAB-like way of plotting in Python. It serves as the primary entry point for creating plots and visualizations by offering a collection of functions that make changes to a figure, such as creating a figure, creating a plotting area in a figure, plotting lines, decorating the plot with labels, and more. The module maintains an internal state that tracks the current figure and axes, allowing users to build plots incrementally without explicitly managing figure objects. `pyplot` is widely used in data science, scientific computing, academic research, and business analytics for creating static, animated, and interactive visualizations. It's particularly popular for exploratory data analysis, creating publication-quality plots, generating reports with embedded charts, and building dashboards. The module's simple syntax makes it ideal for quick plotting tasks, prototyping visualizations, and educational purposes where users need to create plots with minimal code. From d93bf59ddbf68654ed6ceee04056f292e93ad6ab Mon Sep 17 00:00:00 2001 From: Avdhoot <50920321+avdhoottt@users.noreply.github.com> Date: Thu, 29 May 2025 15:51:01 +0530 Subject: [PATCH 10/10] Update content/matplotlib/concepts/pyplot/pyplot.md --- content/matplotlib/concepts/pyplot/pyplot.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/content/matplotlib/concepts/pyplot/pyplot.md b/content/matplotlib/concepts/pyplot/pyplot.md index 64a3d68ce9e..3f220e5e7fe 100644 --- a/content/matplotlib/concepts/pyplot/pyplot.md +++ b/content/matplotlib/concepts/pyplot/pyplot.md @@ -23,7 +23,7 @@ The **`pyplot`** is a state-based interface module in the matplotlib library tha 1. **Import the module**: `import matplotlib.pyplot as plt` 2. **Prepare data**: Create or load the data to be plotted -3. **Create plot**: Use plotting functions like `plt.plot()`, [`plt.scatter()`](https://www.codecademy.com/resources/docs/matplotlib/pyplot/scatter), [`plt.bar()`](https://www.w3schools.com/python/matplotlib_pyplot.asp), etc. +3. **Create plot**: Use plotting functions like `plt.plot()`, `plt.scatter()`, `plt.bar()`, etc. 4. **Customize plot**: Add labels, titles, legends using functions like `plt.xlabel()`, `plt.title()`, `plt.legend()` 5. **Display plot**: Use `plt.show()` to display the plot or `plt.savefig()` to save it