Skip to content

Log Custom Chart

SwanLab provides API compatibility with pyecharts, enabling seamless recording of pyecharts charts to SwanLab for rich visualization. Click the tag below for an online demo:

Line

line

python
import swanlab

swanlab.init(project="echarts-test")

# Define data
week_name_list = ["周一", "周二", "周三", "周四", "周五", "周六", "周日"]
high_temperature = [11, 11, 15, 13, 12, 13, 10]
low_temperature = [1, -2, 2, 5, 3, 2, 0]

# Create echarts line object
line = swanlab.echarts.Line()

# Set line axis
line.add_xaxis(week_name_list)
# Set line data
line.add_yaxis("high_temperature", high_temperature)
line.add_yaxis("low_temperature", low_temperature)

# Log to SwanLab
swanlab.log({"line": line})

Bar Chart

bar

python
import swanlab  

swanlab.init(project="echarts-test")  

# Define data  
x = ["a", "b", "c"]  
y = [1, 2, 3]  

# Create echarts bar object  
bar = swanlab.echarts.Bar()  

# Set x-axis data  
bar.add_xaxis(x)  
# Set y-axis data  
bar.add_yaxis("value", y)  

# Log to SwanLab  
swanlab.log({"bar": bar})

Pie Chart

pie

python
import swanlab  

swanlab.init(project="echarts-test")  

# Define data  
x_data = ["Direct", "Email", "Affiliate", "Video", "Search Engine"]  
y_data = [335, 310, 274, 235, 400]  

# Pair data  
data_pair = [list(z) for z in zip(x_data, y_data)]  
data_pair.sort(key=lambda x: x[1])  

# Create echarts pie object  
pie = swanlab.echarts.Pie()  

# Set data and configure label display  
pie.add(  
    "Traffic Sources",  
    data_pair,  
    label_opts={  
        "formatter": "{b}: {d}%",  # Show percentage  
        "position": "outside"  # Label position  
    }  
)  

# Log to SwanLab  
swanlab.log({"pie": pie})

Heatmap

heatmap

python
import swanlab  

swanlab.init(project="echarts-test")  

# Define data  
hours = ["12a", "1a", "2a", "3a", "4a", "5a", "6a", "7a", "8a", "9a", "10a", "11a",  
         "12p", "1p", "2p", "3p", "4p", "5p", "6p", "7p", "8p", "9p", "10p", "11p"]  
days = ["Saturday", "Friday", "Thursday", "Wednesday", "Tuesday", "Monday", "Sunday"]  

data = [  
    [0, 0, 5], [0, 1, 1], [0, 2, 0], [0, 3, 0], [0, 4, 0], [0, 5, 0], [0, 6, 0], [0, 7, 0],  
    [0, 8, 0], [0, 9, 0], [0, 10, 0], [0, 11, 2], [0, 12, 4], [0, 13, 1], [0, 14, 1], [0, 15, 3],  
    [0, 16, 4], [0, 17, 6], [0, 18, 4], [0, 19, 4], [0, 20, 3], [0, 21, 3], [0, 22, 2], [0, 23, 5],  
    [1, 0, 7], [1, 1, 0], [1, 2, 0], [1, 3, 0], [1, 4, 0], [1, 5, 0], [1, 6, 0], [1, 7, 0],  
    [1, 8, 0], [1, 9, 0], [1, 10, 5], [1, 11, 2], [1, 12, 2], [1, 13, 6], [1, 14, 9], [1, 15, 11],  
    [1, 16, 6], [1, 17, 7], [1, 18, 8], [1, 19, 12], [1, 20, 5], [1, 21, 5], [1, 22, 7], [1, 23, 2],  
    [2, 0, 1], [2, 1, 1], [2, 2, 0], [2, 3, 0], [2, 4, 0], [2, 5, 0], [2, 6, 0], [2, 7, 0],  
    [2, 8, 0], [2, 9, 0], [2, 10, 3], [2, 11, 2], [2, 12, 1], [2, 13, 9], [2, 14, 8], [2, 15, 10],  
    [2, 16, 6], [2, 17, 5], [2, 18, 5], [2, 19, 5], [2, 20, 7], [2, 21, 4], [2, 22, 2], [2, 23, 4],  
    [3, 0, 7], [3, 1, 3], [3, 2, 0], [3, 3, 0], [3, 4, 0], [3, 5, 0], [3, 6, 0], [3, 7, 0],  
    [3, 8, 1], [3, 9, 0], [3, 10, 5], [3, 11, 4], [3, 12, 7], [3, 13, 14], [3, 14, 13], [3, 15, 12],  
    [3, 16, 9], [3, 17, 5], [3, 18, 5], [3, 19, 10], [3, 20, 6], [3, 21, 4], [3, 22, 4], [3, 23, 1],  
    [4, 0, 1], [4, 1, 3], [4, 2, 0], [4, 3, 0], [4, 4, 0], [4, 5, 1], [4, 6, 0], [4, 7, 0],  
    [4, 8, 0], [4, 9, 2], [4, 10, 4], [4, 11, 4], [4, 12, 2], [4, 13, 4], [4, 14, 4], [4, 15, 14],  
    [4, 16, 12], [4, 17, 1], [4, 18, 8], [4, 19, 5], [4, 20, 3], [4, 21, 7], [4, 22, 3], [4, 23, 0],  
    [5, 0, 2], [5, 1, 1], [5, 2, 0], [5, 3, 3], [5, 4, 0], [5, 5, 0], [5, 6, 0], [5, 7, 0],  
    [5, 8, 2], [5, 9, 0], [5, 10, 4], [5, 11, 1], [5, 12, 5], [5, 13, 10], [5, 14, 5], [5, 15, 7],  
    [5, 16, 11], [5, 17, 6], [5, 18, 0], [5, 19, 5], [5, 20, 3], [5, 21, 4], [5, 22, 2], [5, 23, 0],  
    [6, 0, 1], [6, 1, 0], [6, 2, 0], [6, 3, 0], [6, 4, 0], [6, 5, 0], [6, 6, 0], [6, 7, 0],  
    [6, 8, 0], [6, 9, 0], [6, 10, 1], [6, 11, 0], [6, 12, 2], [6, 13, 1], [6, 14, 3], [6, 15, 4],  
    [6, 16, 0], [6, 17, 0], [6, 18, 0], [6, 19, 0], [6, 20, 1], [6, 21, 2], [6, 22, 2], [6, 23, 6],  
]  
data = [[d[1], d[0], d[2] or "-"] for d in data]  

# Create echarts heatmap object  
heatmap = swanlab.echarts.HeatMap()  

# Set axis data  
heatmap.add_xaxis(hours)  
heatmap.add_yaxis(  
    "Punch Card",  
    days,  
    data,  
)  

# Log to SwanLab  
swanlab.log({"heatmap": heatmap})

Scatter Plot

python
import swanlab  

swanlab.init(project="echarts-test")  

# Define data  
data = [  
    [10.0, 8.04],  
    [8.0, 6.95],  
    [13.0, 7.58],  
    [9.0, 8.81],  
    [11.0, 8.33],  
    [14.0, 9.96],  
    [6.0, 7.24],  
    [4.0, 4.26],  
    [12.0, 10.84],  
    [7.0, 4.82],  
    [5.0, 5.68],  
]  
data.sort(key=lambda x: x[0])  
x_data = [d[0] for d in data]  
y_data = [d[1] for d in data]  

# Create echarts scatter object  
scatter = swanlab.echarts.Scatter()  

# Set data  
scatter.add_xaxis(x_data)  
scatter.add_yaxis(  
    "",  
    y_data,  
    symbol_size=20,  
)  

# Log to SwanLab  
swanlab.log({"scatter": scatter})

Radar Chart

radar

python
import swanlab  

swanlab.init(project="echarts-test")  

# Define data  
v1 = [[4300, 10000, 28000, 35000, 50000, 19000]]  
v2 = [[5000, 14000, 28000, 31000, 42000, 21000]]  

# Create echarts radar object  
radar = swanlab.echarts.Radar()  

# Configure radar dimensions and scale  
radar.add_schema(  
    schema=[  
        {"name": "Sales", "max": 6500},  
        {"name": "Management", "max": 16000},  
        {"name": "IT", "max": 30000},  
        {"name": "Support", "max": 38000},  
        {"name": "R&D", "max": 52000},  
        {"name": "Marketing", "max": 25000},  
    ]  
)  

# Add data series  
radar.add(  
    "Budget",  
    v1,  
    color="#1f77b4",  
)  

radar.add(  
    "Actual",  
    v2,  
    color="#ff7f0e",  
)  

# Log to SwanLab  
swanlab.log({"radar": radar})

Boxplot

boxplot

python
import swanlab  

swanlab.init(project="echarts-test")  

# Define data  
y_data = [  
    [850, 740, 900, 1070, 930, 850, 950, 980, 980, 880, 1000, 980, 930, 650, 760, 810, 1000, 1000, 960, 960],  
    [960, 940, 960, 940, 880, 800, 850, 880, 900, 840, 830, 790, 810, 880, 880, 830, 800, 790, 760, 800],  
    [880, 880, 880, 860, 720, 720, 620, 860, 970, 950, 880, 910, 850, 870, 840, 840, 850, 840, 840, 840],  
    [890, 810, 810, 820, 800, 770, 760, 740, 750, 760, 910, 920, 890, 860, 880, 720, 840, 850, 850, 780],  
    [890, 840, 780, 810, 760, 810, 790, 810, 820, 850, 870, 870, 810, 740, 810, 940, 950, 800, 810, 870],  
]  

# Create echarts boxplot object  
boxplot = swanlab.echarts.Boxplot()  

# Set data  
boxplot.add_xaxis(["expr 0", "expr 1", "expr 2", "expr 3", "expr 4"])  
boxplot.add_yaxis("", boxplot.prepare_data(y_data))  

# Log to SwanLab  
swanlab.log({"boxplot": boxplot})

Parallel

parallel

python
import swanlab

swanlab.init(project="echarts-test")

# 定义数据
parallel_axis = [
    {"dim": 0, "name": "Price"},
    {"dim": 1, "name": "Net Weight"},
    {"dim": 2, "name": "Amount"},
    {
        "dim": 3,
        "name": "Score",
        "type": "category",
        "data": ["Excellent", "Good", "OK", "Bad"],
    },
]

data = [[12.99, 100, 82, "Good"], [9.99, 80, 77, "OK"], [20, 120, 60, "Excellent"]]

# Create echarts parallel object
parallel = swanlab.echarts.Parallel()

# Set parallel axis
parallel.add_schema(parallel_axis)
# Set parallel data
parallel.add("data", data=data)

# Log to SwanLab
swanlab.log({"parallel": parallel})

Gauge

gauge

python
import swanlab

swanlab.init(project="swanlab-echarts-demo")

# Create echarts gauge object
gauge = swanlab.echarts.Gauge()
gauge.add("", [("完成率", 66.6)])

# Log to SwanLab
swanlab.log({"gauge": gauge})