Initial commit for matplotlib
This commit is contained in:
476
references/plot_types.md
Normal file
476
references/plot_types.md
Normal file
@@ -0,0 +1,476 @@
|
||||
# Matplotlib Plot Types Guide
|
||||
|
||||
Comprehensive guide to different plot types in matplotlib with examples and use cases.
|
||||
|
||||
## 1. Line Plots
|
||||
|
||||
**Use cases:** Time series, continuous data, trends, function visualization
|
||||
|
||||
### Basic Line Plot
|
||||
```python
|
||||
fig, ax = plt.subplots(figsize=(10, 6))
|
||||
ax.plot(x, y, linewidth=2, label='Data')
|
||||
ax.set_xlabel('X axis')
|
||||
ax.set_ylabel('Y axis')
|
||||
ax.legend()
|
||||
```
|
||||
|
||||
### Multiple Lines
|
||||
```python
|
||||
ax.plot(x, y1, label='Dataset 1', linewidth=2)
|
||||
ax.plot(x, y2, label='Dataset 2', linewidth=2, linestyle='--')
|
||||
ax.plot(x, y3, label='Dataset 3', linewidth=2, linestyle=':')
|
||||
ax.legend()
|
||||
```
|
||||
|
||||
### Line with Markers
|
||||
```python
|
||||
ax.plot(x, y, marker='o', markersize=8, linestyle='-',
|
||||
linewidth=2, markerfacecolor='red', markeredgecolor='black')
|
||||
```
|
||||
|
||||
### Step Plot
|
||||
```python
|
||||
ax.step(x, y, where='mid', linewidth=2, label='Step function')
|
||||
# where options: 'pre', 'post', 'mid'
|
||||
```
|
||||
|
||||
### Error Bars
|
||||
```python
|
||||
ax.errorbar(x, y, yerr=error, fmt='o-', linewidth=2,
|
||||
capsize=5, capthick=2, label='With uncertainty')
|
||||
```
|
||||
|
||||
## 2. Scatter Plots
|
||||
|
||||
**Use cases:** Correlations, relationships between variables, clusters, outliers
|
||||
|
||||
### Basic Scatter
|
||||
```python
|
||||
ax.scatter(x, y, s=50, alpha=0.6)
|
||||
```
|
||||
|
||||
### Sized and Colored Scatter
|
||||
```python
|
||||
scatter = ax.scatter(x, y, s=sizes*100, c=colors,
|
||||
cmap='viridis', alpha=0.6, edgecolors='black')
|
||||
plt.colorbar(scatter, ax=ax, label='Color variable')
|
||||
```
|
||||
|
||||
### Categorical Scatter
|
||||
```python
|
||||
for category in categories:
|
||||
mask = data['category'] == category
|
||||
ax.scatter(data[mask]['x'], data[mask]['y'],
|
||||
label=category, s=50, alpha=0.7)
|
||||
ax.legend()
|
||||
```
|
||||
|
||||
## 3. Bar Charts
|
||||
|
||||
**Use cases:** Categorical comparisons, discrete data, counts
|
||||
|
||||
### Vertical Bar Chart
|
||||
```python
|
||||
ax.bar(categories, values, color='steelblue',
|
||||
edgecolor='black', linewidth=1.5)
|
||||
ax.set_ylabel('Values')
|
||||
```
|
||||
|
||||
### Horizontal Bar Chart
|
||||
```python
|
||||
ax.barh(categories, values, color='coral',
|
||||
edgecolor='black', linewidth=1.5)
|
||||
ax.set_xlabel('Values')
|
||||
```
|
||||
|
||||
### Grouped Bar Chart
|
||||
```python
|
||||
x = np.arange(len(categories))
|
||||
width = 0.35
|
||||
|
||||
ax.bar(x - width/2, values1, width, label='Group 1')
|
||||
ax.bar(x + width/2, values2, width, label='Group 2')
|
||||
ax.set_xticks(x)
|
||||
ax.set_xticklabels(categories)
|
||||
ax.legend()
|
||||
```
|
||||
|
||||
### Stacked Bar Chart
|
||||
```python
|
||||
ax.bar(categories, values1, label='Part 1')
|
||||
ax.bar(categories, values2, bottom=values1, label='Part 2')
|
||||
ax.bar(categories, values3, bottom=values1+values2, label='Part 3')
|
||||
ax.legend()
|
||||
```
|
||||
|
||||
### Bar Chart with Error Bars
|
||||
```python
|
||||
ax.bar(categories, values, yerr=errors, capsize=5,
|
||||
color='steelblue', edgecolor='black')
|
||||
```
|
||||
|
||||
### Bar Chart with Patterns
|
||||
```python
|
||||
bars1 = ax.bar(x - width/2, values1, width, label='Group 1',
|
||||
color='white', edgecolor='black', hatch='//')
|
||||
bars2 = ax.bar(x + width/2, values2, width, label='Group 2',
|
||||
color='white', edgecolor='black', hatch='\\\\')
|
||||
```
|
||||
|
||||
## 4. Histograms
|
||||
|
||||
**Use cases:** Distributions, frequency analysis
|
||||
|
||||
### Basic Histogram
|
||||
```python
|
||||
ax.hist(data, bins=30, edgecolor='black', alpha=0.7)
|
||||
ax.set_xlabel('Value')
|
||||
ax.set_ylabel('Frequency')
|
||||
```
|
||||
|
||||
### Multiple Overlapping Histograms
|
||||
```python
|
||||
ax.hist(data1, bins=30, alpha=0.5, label='Dataset 1')
|
||||
ax.hist(data2, bins=30, alpha=0.5, label='Dataset 2')
|
||||
ax.legend()
|
||||
```
|
||||
|
||||
### Normalized Histogram (Density)
|
||||
```python
|
||||
ax.hist(data, bins=30, density=True, alpha=0.7,
|
||||
edgecolor='black', label='Empirical')
|
||||
|
||||
# Overlay theoretical distribution
|
||||
from scipy.stats import norm
|
||||
x = np.linspace(data.min(), data.max(), 100)
|
||||
ax.plot(x, norm.pdf(x, data.mean(), data.std()),
|
||||
'r-', linewidth=2, label='Normal fit')
|
||||
ax.legend()
|
||||
```
|
||||
|
||||
### 2D Histogram (Hexbin)
|
||||
```python
|
||||
hexbin = ax.hexbin(x, y, gridsize=30, cmap='Blues')
|
||||
plt.colorbar(hexbin, ax=ax, label='Counts')
|
||||
```
|
||||
|
||||
### 2D Histogram (hist2d)
|
||||
```python
|
||||
h = ax.hist2d(x, y, bins=30, cmap='Blues')
|
||||
plt.colorbar(h[3], ax=ax, label='Counts')
|
||||
```
|
||||
|
||||
## 5. Box and Violin Plots
|
||||
|
||||
**Use cases:** Statistical distributions, outlier detection, comparing distributions
|
||||
|
||||
### Box Plot
|
||||
```python
|
||||
ax.boxplot([data1, data2, data3],
|
||||
labels=['Group A', 'Group B', 'Group C'],
|
||||
showmeans=True, meanline=True)
|
||||
ax.set_ylabel('Values')
|
||||
```
|
||||
|
||||
### Horizontal Box Plot
|
||||
```python
|
||||
ax.boxplot([data1, data2, data3], vert=False,
|
||||
labels=['Group A', 'Group B', 'Group C'])
|
||||
ax.set_xlabel('Values')
|
||||
```
|
||||
|
||||
### Violin Plot
|
||||
```python
|
||||
parts = ax.violinplot([data1, data2, data3],
|
||||
positions=[1, 2, 3],
|
||||
showmeans=True, showmedians=True)
|
||||
ax.set_xticks([1, 2, 3])
|
||||
ax.set_xticklabels(['Group A', 'Group B', 'Group C'])
|
||||
```
|
||||
|
||||
## 6. Heatmaps
|
||||
|
||||
**Use cases:** Matrix data, correlations, intensity maps
|
||||
|
||||
### Basic Heatmap
|
||||
```python
|
||||
im = ax.imshow(matrix, cmap='coolwarm', aspect='auto')
|
||||
plt.colorbar(im, ax=ax, label='Values')
|
||||
ax.set_xlabel('X')
|
||||
ax.set_ylabel('Y')
|
||||
```
|
||||
|
||||
### Heatmap with Annotations
|
||||
```python
|
||||
im = ax.imshow(matrix, cmap='coolwarm')
|
||||
plt.colorbar(im, ax=ax)
|
||||
|
||||
# Add text annotations
|
||||
for i in range(matrix.shape[0]):
|
||||
for j in range(matrix.shape[1]):
|
||||
text = ax.text(j, i, f'{matrix[i, j]:.2f}',
|
||||
ha='center', va='center', color='black')
|
||||
```
|
||||
|
||||
### Correlation Matrix
|
||||
```python
|
||||
corr = data.corr()
|
||||
im = ax.imshow(corr, cmap='RdBu_r', vmin=-1, vmax=1)
|
||||
plt.colorbar(im, ax=ax, label='Correlation')
|
||||
|
||||
# Set tick labels
|
||||
ax.set_xticks(range(len(corr)))
|
||||
ax.set_yticks(range(len(corr)))
|
||||
ax.set_xticklabels(corr.columns, rotation=45, ha='right')
|
||||
ax.set_yticklabels(corr.columns)
|
||||
```
|
||||
|
||||
## 7. Contour Plots
|
||||
|
||||
**Use cases:** 3D data on 2D plane, topography, function visualization
|
||||
|
||||
### Contour Lines
|
||||
```python
|
||||
contour = ax.contour(X, Y, Z, levels=10, cmap='viridis')
|
||||
ax.clabel(contour, inline=True, fontsize=8)
|
||||
plt.colorbar(contour, ax=ax)
|
||||
```
|
||||
|
||||
### Filled Contours
|
||||
```python
|
||||
contourf = ax.contourf(X, Y, Z, levels=20, cmap='viridis')
|
||||
plt.colorbar(contourf, ax=ax)
|
||||
```
|
||||
|
||||
### Combined Contours
|
||||
```python
|
||||
contourf = ax.contourf(X, Y, Z, levels=20, cmap='viridis', alpha=0.8)
|
||||
contour = ax.contour(X, Y, Z, levels=10, colors='black',
|
||||
linewidths=0.5, alpha=0.4)
|
||||
ax.clabel(contour, inline=True, fontsize=8)
|
||||
plt.colorbar(contourf, ax=ax)
|
||||
```
|
||||
|
||||
## 8. Pie Charts
|
||||
|
||||
**Use cases:** Proportions, percentages (use sparingly)
|
||||
|
||||
### Basic Pie Chart
|
||||
```python
|
||||
ax.pie(sizes, labels=labels, autopct='%1.1f%%',
|
||||
startangle=90, colors=colors)
|
||||
ax.axis('equal') # Equal aspect ratio ensures circular pie
|
||||
```
|
||||
|
||||
### Exploded Pie Chart
|
||||
```python
|
||||
explode = (0.1, 0, 0, 0) # Explode first slice
|
||||
ax.pie(sizes, explode=explode, labels=labels,
|
||||
autopct='%1.1f%%', shadow=True, startangle=90)
|
||||
ax.axis('equal')
|
||||
```
|
||||
|
||||
### Donut Chart
|
||||
```python
|
||||
ax.pie(sizes, labels=labels, autopct='%1.1f%%',
|
||||
wedgeprops=dict(width=0.5), startangle=90)
|
||||
ax.axis('equal')
|
||||
```
|
||||
|
||||
## 9. Polar Plots
|
||||
|
||||
**Use cases:** Cyclic data, directional data, radar charts
|
||||
|
||||
### Basic Polar Plot
|
||||
```python
|
||||
theta = np.linspace(0, 2*np.pi, 100)
|
||||
r = np.abs(np.sin(2*theta))
|
||||
|
||||
ax = plt.subplot(111, projection='polar')
|
||||
ax.plot(theta, r, linewidth=2)
|
||||
```
|
||||
|
||||
### Radar Chart
|
||||
```python
|
||||
categories = ['A', 'B', 'C', 'D', 'E']
|
||||
values = [4, 3, 5, 2, 4]
|
||||
|
||||
# Add first value to the end to close the polygon
|
||||
angles = np.linspace(0, 2*np.pi, len(categories), endpoint=False)
|
||||
values_closed = np.concatenate((values, [values[0]]))
|
||||
angles_closed = np.concatenate((angles, [angles[0]]))
|
||||
|
||||
ax = plt.subplot(111, projection='polar')
|
||||
ax.plot(angles_closed, values_closed, 'o-', linewidth=2)
|
||||
ax.fill(angles_closed, values_closed, alpha=0.25)
|
||||
ax.set_xticks(angles)
|
||||
ax.set_xticklabels(categories)
|
||||
```
|
||||
|
||||
## 10. Stream and Quiver Plots
|
||||
|
||||
**Use cases:** Vector fields, flow visualization
|
||||
|
||||
### Quiver Plot (Vector Field)
|
||||
```python
|
||||
ax.quiver(X, Y, U, V, alpha=0.8)
|
||||
ax.set_xlabel('X')
|
||||
ax.set_ylabel('Y')
|
||||
ax.set_aspect('equal')
|
||||
```
|
||||
|
||||
### Stream Plot
|
||||
```python
|
||||
ax.streamplot(X, Y, U, V, density=1.5, color='k', linewidth=1)
|
||||
ax.set_xlabel('X')
|
||||
ax.set_ylabel('Y')
|
||||
ax.set_aspect('equal')
|
||||
```
|
||||
|
||||
## 11. Fill Between
|
||||
|
||||
**Use cases:** Uncertainty bounds, confidence intervals, areas under curves
|
||||
|
||||
### Fill Between Two Curves
|
||||
```python
|
||||
ax.plot(x, y, 'k-', linewidth=2, label='Mean')
|
||||
ax.fill_between(x, y - std, y + std, alpha=0.3,
|
||||
label='±1 std dev')
|
||||
ax.legend()
|
||||
```
|
||||
|
||||
### Fill Between with Condition
|
||||
```python
|
||||
ax.plot(x, y1, label='Line 1')
|
||||
ax.plot(x, y2, label='Line 2')
|
||||
ax.fill_between(x, y1, y2, where=(y2 >= y1),
|
||||
alpha=0.3, label='y2 > y1', interpolate=True)
|
||||
ax.legend()
|
||||
```
|
||||
|
||||
## 12. 3D Plots
|
||||
|
||||
**Use cases:** Three-dimensional data visualization
|
||||
|
||||
### 3D Scatter
|
||||
```python
|
||||
from mpl_toolkits.mplot3d import Axes3D
|
||||
|
||||
fig = plt.figure(figsize=(10, 8))
|
||||
ax = fig.add_subplot(111, projection='3d')
|
||||
scatter = ax.scatter(x, y, z, c=colors, cmap='viridis',
|
||||
marker='o', s=50)
|
||||
plt.colorbar(scatter, ax=ax)
|
||||
ax.set_xlabel('X')
|
||||
ax.set_ylabel('Y')
|
||||
ax.set_zlabel('Z')
|
||||
```
|
||||
|
||||
### 3D Surface Plot
|
||||
```python
|
||||
fig = plt.figure(figsize=(10, 8))
|
||||
ax = fig.add_subplot(111, projection='3d')
|
||||
surf = ax.plot_surface(X, Y, Z, cmap='viridis',
|
||||
edgecolor='none', alpha=0.9)
|
||||
plt.colorbar(surf, ax=ax)
|
||||
ax.set_xlabel('X')
|
||||
ax.set_ylabel('Y')
|
||||
ax.set_zlabel('Z')
|
||||
```
|
||||
|
||||
### 3D Wireframe
|
||||
```python
|
||||
fig = plt.figure(figsize=(10, 8))
|
||||
ax = fig.add_subplot(111, projection='3d')
|
||||
ax.plot_wireframe(X, Y, Z, color='black', linewidth=0.5)
|
||||
ax.set_xlabel('X')
|
||||
ax.set_ylabel('Y')
|
||||
ax.set_zlabel('Z')
|
||||
```
|
||||
|
||||
### 3D Contour
|
||||
```python
|
||||
fig = plt.figure(figsize=(10, 8))
|
||||
ax = fig.add_subplot(111, projection='3d')
|
||||
ax.contour(X, Y, Z, levels=15, cmap='viridis')
|
||||
ax.set_xlabel('X')
|
||||
ax.set_ylabel('Y')
|
||||
ax.set_zlabel('Z')
|
||||
```
|
||||
|
||||
## 13. Specialized Plots
|
||||
|
||||
### Stem Plot
|
||||
```python
|
||||
ax.stem(x, y, linefmt='C0-', markerfmt='C0o', basefmt='k-')
|
||||
ax.set_xlabel('X')
|
||||
ax.set_ylabel('Y')
|
||||
```
|
||||
|
||||
### Filled Polygon
|
||||
```python
|
||||
vertices = [(0, 0), (1, 0), (1, 1), (0, 1)]
|
||||
from matplotlib.patches import Polygon
|
||||
polygon = Polygon(vertices, closed=True, edgecolor='black',
|
||||
facecolor='lightblue', alpha=0.5)
|
||||
ax.add_patch(polygon)
|
||||
ax.set_xlim(-0.5, 1.5)
|
||||
ax.set_ylim(-0.5, 1.5)
|
||||
```
|
||||
|
||||
### Staircase Plot
|
||||
```python
|
||||
ax.stairs(values, edges, fill=True, alpha=0.5)
|
||||
```
|
||||
|
||||
### Broken Barh (Gantt-style)
|
||||
```python
|
||||
ax.broken_barh([(10, 50), (100, 20), (130, 10)], (10, 9),
|
||||
facecolors='tab:blue')
|
||||
ax.broken_barh([(10, 20), (50, 50), (120, 30)], (20, 9),
|
||||
facecolors='tab:orange')
|
||||
ax.set_ylim(5, 35)
|
||||
ax.set_xlim(0, 200)
|
||||
ax.set_xlabel('Time')
|
||||
ax.set_yticks([15, 25])
|
||||
ax.set_yticklabels(['Task 1', 'Task 2'])
|
||||
```
|
||||
|
||||
## 14. Time Series Plots
|
||||
|
||||
### Basic Time Series
|
||||
```python
|
||||
import pandas as pd
|
||||
import matplotlib.dates as mdates
|
||||
|
||||
ax.plot(dates, values, linewidth=2)
|
||||
ax.xaxis.set_major_formatter(mdates.DateFormatter('%Y-%m-%d'))
|
||||
ax.xaxis.set_major_locator(mdates.DayLocator(interval=7))
|
||||
plt.xticks(rotation=45)
|
||||
ax.set_xlabel('Date')
|
||||
ax.set_ylabel('Value')
|
||||
```
|
||||
|
||||
### Time Series with Shaded Regions
|
||||
```python
|
||||
ax.plot(dates, values, linewidth=2)
|
||||
# Shade weekends or specific periods
|
||||
ax.axvspan(start_date, end_date, alpha=0.2, color='gray')
|
||||
```
|
||||
|
||||
## Plot Selection Guide
|
||||
|
||||
| Data Type | Recommended Plot | Alternative Options |
|
||||
|-----------|-----------------|---------------------|
|
||||
| Single continuous variable | Histogram, KDE | Box plot, Violin plot |
|
||||
| Two continuous variables | Scatter plot | Hexbin, 2D histogram |
|
||||
| Time series | Line plot | Area plot, Step plot |
|
||||
| Categorical vs continuous | Bar chart, Box plot | Violin plot, Strip plot |
|
||||
| Two categorical variables | Heatmap | Grouped bar chart |
|
||||
| Three continuous variables | 3D scatter, Contour | Color-coded scatter |
|
||||
| Proportions | Bar chart | Pie chart (use sparingly) |
|
||||
| Distributions comparison | Box plot, Violin plot | Overlaid histograms |
|
||||
| Correlation matrix | Heatmap | Clustered heatmap |
|
||||
| Vector field | Quiver plot, Stream plot | - |
|
||||
| Function visualization | Line plot, Contour | 3D surface |
|
||||
Reference in New Issue
Block a user