Skip to main content

Financial Time Series Charts with Vizly

Financial data demands specialized chart types: candlestick for price action, combo for comparing metrics, waterfall for cumulative changes. Vizly handles all of them with the same data-in, chart-out API. v1.0.1 accepts pd.DataFrame, list[dict], or dict[list] directly. Use chart.render('file.html') to write to a file or chart.to_html() for a string.

Candlestick price chart

The standard for OHLC (open, high, low, close) price visualization.

import pandas as pd
import vizly as vz

vz.set_theme("corporate")

df = pd.DataFrame({
'date': ['2026-01-01', '2026-01-02', '2026-01-03', '2026-01-04',
'2026-01-05', '2026-01-06', '2026-01-07', '2026-01-08',
'2026-01-09', '2026-01-10', '2026-01-11', '2026-01-12'],
'open': [100, 104, 101, 108, 112, 109, 115, 118, 114, 121, 125, 122],
'close': [104, 101, 108, 112, 109, 115, 118, 114, 121, 125, 122, 129],
'low': [98, 99, 100, 106, 107, 108, 113, 112, 113, 119, 120, 121],
'high': [106, 105, 110, 114, 114, 117, 120, 119, 123, 127, 126, 131],
})
chart = vz.candlestick(df, x='date', title='Price action', theme='corporate')
chart.to_html()

K-line (alternative candlestick)

kline is an alias for candlestick with slightly different default styling.

import pandas as pd
import vizly as vz

# Same OHLC DataFrame format
df = pd.DataFrame({
'date': ['2026-01-01', '2026-01-02', '2026-01-03', '2026-01-04',
'2026-01-05', '2026-01-06', '2026-01-07', '2026-01-08',
'2026-01-09', '2026-01-10', '2026-01-11', '2026-01-12'],
'open': [100, 104, 101, 108, 112, 109, 115, 118, 114, 121, 125, 122],
'close': [104, 101, 108, 112, 109, 115, 118, 114, 121, 125, 122, 129],
'low': [98, 99, 100, 106, 107, 108, 113, 112, 113, 119, 120, 121],
'high': [106, 105, 110, 114, 114, 117, 120, 119, 123, 127, 126, 131],
})
chart = vz.kline(df, x='date', title='Price action (k-line)', theme='corporate')

Combo chart: revenue vs cost

Mix bar and line series on the same axis for direct comparison.

import pandas as pd
import vizly as vz

df = pd.DataFrame({
'date': ['2026-01-01', '2026-01-02', '2026-01-03', '2026-01-04',
'2026-01-05', '2026-01-06', '2026-01-07', '2026-01-08',
'2026-01-09', '2026-01-10', '2026-01-11', '2026-01-12',
'2026-01-13', '2026-01-14'],
'revenue': [42, 48, 45, 61, 58, 72, 68, 81, 76, 90, 84, 95, 88, 102],
'cost': [18, 20, 19, 24, 22, 28, 26, 31, 29, 34, 32, 37, 35, 40],
})
chart = vz.combo(df, x='date', bar='cost', line='revenue',
title='Revenue vs cost', theme='corporate')

# `mix` is an alias for `combo`
chart2 = vz.mix(df, x='date', bar='cost', line='revenue',
title='Revenue vs cost', theme='corporate')

ARR waterfall bridge

Show how starting ARR changes through additions and deductions.

import pandas as pd
import vizly as vz

df = pd.DataFrame({
'step': ['Starting ARR', 'New logos', 'Expansion', 'Churn',
'Downgrade', 'Ending ARR'],
'delta': [120, 45, 28, -18, -12, 0],
})
chart = vz.waterfall(df, x='step', y='delta',
title='ARR bridge', theme='corporate')

Revenue and cost mix

The mix/combo chart is especially useful for financial analysis where you want to overlay different data types.

import pandas as pd
import vizly as vz

df = pd.DataFrame({
'quarter': ['Q1 2025', 'Q2 2025', 'Q3 2025', 'Q4 2025',
'Q1 2026', 'Q2 2026'],
'revenue': [320, 345, 380, 412, 390, 440],
'expenses': [280, 295, 310, 335, 320, 350],
'profit_margin': [12.5, 14.5, 18.4, 18.7, 17.9, 20.5],
})
chart = vz.mix(df, x='quarter', bar=['revenue', 'expenses'],
line='profit_margin',
title='Quarterly financials with margin %', theme='corporate')

Full financial dashboard

Combine all financial views into one page.

import pandas as pd
import vizly as vz

vz.set_theme("corporate")

df_candle = pd.DataFrame({
'date': ['2026-01-01', '2026-01-02', '2026-01-03', '2026-01-04', '2026-01-05'],
'open': [100, 104, 101, 108, 112],
'close': [104, 101, 108, 112, 109],
'low': [98, 99, 100, 106, 107],
'high': [106, 105, 110, 114, 114],
})
df_rev = pd.DataFrame({
'month': ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun'],
'revenue': [320, 345, 380, 412, 390, 440],
'cost': [280, 295, 310, 335, 320, 350],
})
df_arr = pd.DataFrame({
'step': ['Starting ARR', 'New logos', 'Expansion', 'Churn', 'Ending ARR'],
'delta': [120, 45, 28, -18, 0],
})

chart = vz.page(charts=[
vz.candlestick(df_candle, x='date', title='Price action'),
vz.combo(df_rev, x='month', bar='cost', line='revenue',
title='Revenue vs cost'),
vz.waterfall(df_arr, x='step', y='delta', title='ARR bridge'),
], title="Financial Dashboard")
chart.to_html()

Chart selection guide

Financial questionChart type
How is the stock price moving?candlestick / kline
How do revenue and costs compare?combo / mix
What's driving ARR changes?waterfall
What's the P&L bridge?waterfall
Portfolio returns over time?line
Asset correlation?scatter