Python Dataviz
by @matthew-a-gordon
Professional data visualization using Python (matplotlib, seaborn, plotly). Create publication-quality static charts, statistical visualizations, and interac...
clawhub install python-datavizπ About This Skill
name: python-dataviz description: Professional data visualization using Python (matplotlib, seaborn, plotly). Create publication-quality static charts, statistical visualizations, and interactive plots. Use when generating charts/graphs/plots from data, creating infographics with data components, or producing scientific/statistical visualizations. Supports PNG/SVG (static) and HTML (interactive) export.
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
seaborn - Statistical visualizations, beautiful defaults
plotly - Interactive charts, web-friendly
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 npData
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:
plt.hist() or sns.histplot()sns.boxplot()sns.violinplot()sns.kdeplot()Comparison:
plt.bar() or sns.barplot()sns.barplot(hue=...)plt.barh() or sns.barplot(orient='h')Relationship:
plt.scatter() or sns.scatterplot()plt.plot() or sns.lineplot()sns.regplot() or sns.lmplot()Heatmaps:
sns.heatmap(df.corr())plt.imshow() or sns.heatmap()Interactive:
plotly.express or plotly.graph_objectsBest 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") # BoldCustom 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, ticksOr 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:
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 chartsCommon 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 npx = 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"
plt.savefig() comes AFTER plotting commandsplt.show() for interactive viewing during developmentLabels 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)
π‘ Examples
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 npData
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')
π Tips & 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") # BoldCustom 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, ticksOr 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')