skillby T-Klug
visualization
Knowledge about pyecharts chart creation, HTML report generation, and visualization best practices
Installs: 2
Used in: 1 repos
Updated: 10h ago
$
npx ai-builder add skill T-Klug/visualizationInstalls to .claude/skills/visualization/
# Visualization Skill
## Technology Stack
- **pyecharts**: Python wrapper for Apache ECharts
- **Apache ECharts**: JavaScript charting library
- **Output**: Self-contained HTML with embedded JS
## Chart Types Reference
### Bar Charts
```python
from pyecharts.charts import Bar
from pyecharts import options as opts
chart = Bar()
chart.add_xaxis(labels)
chart.add_yaxis("Series Name", values)
chart.set_global_opts(
title_opts=opts.TitleOpts(title="Chart Title"),
tooltip_opts=opts.TooltipOpts(trigger="axis"),
xaxis_opts=opts.AxisOpts(axislabel_opts=opts.LabelOpts(rotate=45)),
)
```
### Line Charts
```python
from pyecharts.charts import Line
chart = Line()
chart.add_xaxis(dates)
chart.add_yaxis("Actual", values, is_smooth=True)
chart.add_yaxis("7-Day MA", moving_avg_7, is_smooth=True, linestyle_opts=opts.LineStyleOpts(type_="dashed"))
```
### Pie Charts
```python
from pyecharts.charts import Pie
chart = Pie()
chart.add("", list(zip(labels, values)))
chart.set_global_opts(legend_opts=opts.LegendOpts(orient="vertical", pos_left="left"))
```
### Heatmaps
```python
from pyecharts.charts import HeatMap
chart = HeatMap()
chart.add_xaxis(x_labels)
chart.add_yaxis("", y_labels, value=[[x, y, val], ...])
chart.set_global_opts(
visualmap_opts=opts.VisualMapOpts(min_=0, max_=max_val),
)
```
### Scatter Plots (for anomalies)
```python
from pyecharts.charts import Scatter
chart = Scatter()
chart.add_xaxis(dates)
chart.add_yaxis("Cost", costs, symbol_size=10)
# Add anomaly markers with different color/size
```
## Critical: Browser Compatibility
**Always convert to lists for JavaScript:**
```python
# CORRECT
chart.add_xaxis(df['column'].tolist())
chart.add_yaxis("Label", df['values'].tolist())
# WRONG - causes rendering issues
chart.add_xaxis(df['column'].values) # numpy array
chart.add_xaxis(df['column']) # pandas Series
```
## Theme Options
Available themes in pyecharts:
- `macarons` (default) - Colorful, professional
- `shine` - Bright colors
- `roma` - Muted, elegant
- `vintage` - Retro feel
- `dark` - Dark background
- `light` - Light, minimal
Usage:
```python
from pyecharts.globals import ThemeType
chart = Bar(init_opts=opts.InitOpts(theme=ThemeType.MACARONS))
```
## HTML Report Structure
```python
def generate_html_report(self, output_path: str, top_n: int = 10) -> str:
# Create all charts
charts = [
self.create_cost_by_service_chart(top_n),
self.create_cost_by_account_chart(),
# ... more charts
]
# Combine into page
page = Page(layout=Page.SimplePageLayout)
for chart in charts:
page.add(chart)
# Render to file
page.render(output_path)
return output_path
```
## Formatting Numbers
```python
# Currency formatting in tooltips
tooltip_opts=opts.TooltipOpts(
trigger="axis",
formatter="{b}: ${c:,.2f}"
)
# Axis label formatting
yaxis_opts=opts.AxisOpts(
axislabel_opts=opts.LabelOpts(formatter="${value:,.0f}")
)
```
## Common Issues & Solutions
### Empty Charts
1. Check browser console for JS errors
2. Verify `.tolist()` on all data
3. Hard refresh (Ctrl+Shift+R)
4. Check data exists in HTML source
### Chart Too Small
```python
init_opts=opts.InitOpts(width="100%", height="400px")
```
### Labels Overlapping
```python
xaxis_opts=opts.AxisOpts(
axislabel_opts=opts.LabelOpts(rotate=45, interval=0)
)
```
### Legend Too Long
```python
legend_opts=opts.LegendOpts(
type_="scroll",
orient="horizontal",
pos_bottom="0%"
)
```
## Testing Visualizations
```bash
# Test chart creation
uv run pytest tests/test_visualizer.py -v
# Regenerate example report
uv run pytest tests/test_examples.py -v -s
# View in browser
open examples/example_report.html
```Quick Install
$
npx ai-builder add skill T-Klug/visualizationDetails
- Type
- skill
- Author
- T-Klug
- Slug
- T-Klug/visualization
- Created
- 4d ago