Python Data Visualization
Create professional charts, graphs, and statistical visualizations using Python's leading libraries.
Libraries & Use Cases
matplotlib - Static plots, publication-quality, full control
Bar, line, scatter, pie, histogram, heatmap
Multi-panel figures, subplots
Custom styling, annotations
Export: PNG, SVG, PDF
seaborn - Statistical visualizations, beautiful defaults
Distribution plots (violin, box, kde, histogram)
Categorical plots (bar, count, swarm, box)
Relationship plots (scatter, line, regression)
Matrix plots (heatmap, clustermap)
Built on matplotlib, integrates seamlessly
plotly - Interactive charts, web-friendly
Hover tooltips, zoom, pan
3D plots, animations
Dashboards via Dash framework
Export: HTML, PNG (requires kaleido)
Quick Start
Setup Environment
cd skills/python-dataviz
python3 -m venv .venv
source .venv/bin/activate
pip install .
Create a Chart
import matplotlib.pyplot as plt
import numpy as np
# Data
x = np.linspace(0, 10, 100)
y = np.sin(x)
# Plot
plt.figure(figsize=(10, 6))
plt.plot(x, y, linewidth=2, color='#667eea')
plt.title('Sine Wave', fontsize=16, fontweight='bold')
plt.xlabel('X Axis')
plt.ylabel('Y Axis')
plt.grid(alpha=0.3)
plt.tight_layout()
# Export
plt.savefig('output.png', dpi=300, bbox_inches='tight')
plt.savefig('output.svg', bbox_inches='tight')
Chart Selection Guide
Distribution/Statistical:
Histogram →
plt.hist()orsns.histplot()Box plot →
sns.boxplot()Violin plot →
sns.violinplot()KDE →
sns.kdeplot()
Comparison:
Bar chart →
plt.bar()orsns.barplot()Grouped bar →
sns.barplot(hue=...)Horizontal bar →
plt.barh()orsns.barplot(orient='h')
Relationship:
Scatter →
plt.scatter()orsns.scatterplot()Line →
plt.plot()orsns.lineplot()Regression →
sns.regplot()orsns.lmplot()
Heatmaps:
Correlation matrix →
sns.heatmap(df.corr())2D data →
plt.imshow()orsns.heatmap()
Interactive:
Any plotly chart →
plotly.expressorplotly.graph_objectsSee references/plotly-examples.md
Best Practices
1. Figure Size & DPI
plt.figure(figsize=(10, 6)) # Width x Height in inches
plt.savefig('output.png', dpi=300) # Publication: 300 dpi, Web: 72-150 dpi
2. Color Palettes
# Seaborn palettes (works with matplotlib too)
import seaborn as sns
sns.set_palette("husl") # Colorful
sns.set_palette("muted") # Soft
sns.set_palette("deep") # Bold
# Custom colors
colors = ['#667eea', '#764ba2', '#f6ad55', '#4299e1']
3. Styling
# Use seaborn styles even for matplotlib
import seaborn as sns
sns.set_theme() # Better defaults
sns.set_style("whitegrid") # Options: whitegrid, darkgrid, white, dark, ticks
# Or matplotlib styles
plt.style.use('ggplot') # Options: ggplot, seaborn, bmh, fivethirtyeight
4. Multiple Subplots
fig, axes = plt.subplots(2, 2, figsize=(12, 10))
axes[0, 0].plot(x, y1)
axes[0, 1].plot(x, y2)
# etc.
plt.tight_layout() # Prevent label overlap
5. Export Formats
# PNG for sharing/embedding (raster)
plt.savefig('chart.png', dpi=300, bbox_inches='tight', transparent=False)
# SVG for editing/scaling (vector)
plt.savefig('chart.svg', bbox_inches='tight')
# For plotly (interactive)
import plotly.express as px
fig = px.scatter(df, x='col1', y='col2')
fig.write_html('chart.html')
Advanced Topics
See references/ for detailed guides:
Color theory & palettes: references/colors.md
Statistical plots: references/statistical.md
Plotly interactive charts: references/plotly-examples.md
Multi-panel layouts: references/layouts.md
Example Scripts
See scripts/ for ready-to-use examples:
scripts/bar_chart.py- Bar and grouped bar chartsscripts/line_chart.py- Line plots with multiple seriesscripts/scatter_plot.py- Scatter plots with regressionscripts/heatmap.py- Correlation heatmapsscripts/distribution.py- Histograms, KDE, violin plotsscripts/interactive.py- Plotly interactive charts
Common Patterns
Data from CSV
import pandas as pd
df = pd.read_csv('data.csv')
# Plot with pandas (uses matplotlib)
df.plot(x='date', y='value', kind='line', figsize=(10, 6))
plt.savefig('output.png', dpi=300)
# Or with seaborn for better styling
sns.lineplot(data=df, x='date', y='value')
plt.savefig('output.png', dpi=300)
Dictionary Data
data = {'Category A': 25, 'Category B': 40, 'Category C': 15}
# Matplotlib
plt.bar(data.keys(), data.values())
plt.savefig('output.png', dpi=300)
# Seaborn (convert to DataFrame)
import pandas as pd
df = pd.DataFrame(list(data.items()), columns=['Category', 'Value'])
sns.barplot(data=df, x='Category', y='Value')
plt.savefig('output.png', dpi=300)
NumPy Arrays
import numpy as np
x = np.linspace(0, 10, 100)
y = np.sin(x)
plt.plot(x, y)
plt.savefig('output.png', dpi=300)
Troubleshooting
"No module named matplotlib"
cd skills/python-dataviz
source .venv/bin/activate
pip install -r requirements.txt
Blank output / "Figure is empty"
Check that
plt.savefig()comes AFTER plotting commandsUse
plt.show()for interactive viewing during development
Labels cut off
plt.tight_layout() # Add before plt.savefig()
# Or
plt.savefig('output.png', bbox_inches='tight')
Low resolution output
plt.savefig('output.png', dpi=300) # Not 72 or 100
Environment
The skill includes a venv with all dependencies. Always activate before use:
cd /home/matt/.openclaw/workspace/skills/python-dataviz
source .venv/bin/activate
Dependencies: matplotlib, seaborn, plotly, pandas, numpy, kaleido (for plotly static export)