#chart #yew #yew-component #forms #svg #bar #collection

yew-chart

一个可以组装成图表的组件库

2个不稳定版本

0.6.0 2023年11月20日
0.5.0 2022年7月5日

#166WebAssembly

Apache-2.0

295KB
949

Yew图表库

yew-chart 是一组可以组装成图表的组件,适用于 Yew框架

以下是使用此库生成的土壤湿度/降雨图表

Soil moisture/rainfall chart

以下是此库生成的另一张图表,表示所谓的 "Delta-T"

Delta-T chart

通过利用这些基于SVG的组件,可以灵活地形成多种类型的图表。该库旨在作为工具包,提供渲染图表原语(例如线条、多边形等)的便利。

示例图表

examples 文件夹中提供了两个基本项目。

折线图

examples/basic 已配置为输出基本折线图

A line chart

...以下是用于生成它的整个Yew组件

const WIDTH: f32 = 533.0;
const HEIGHT: f32 = 300.0;
const MARGIN: f32 = 50.0;
const TICK_LENGTH: f32 = 10.0;

#[function_component(App)]
fn app() -> Html {
    let end_date = Utc::now();
    let start_date = end_date.sub(Duration::days(4));
    let timespan = start_date..end_date;

    let circle_text_labeller = Rc::from(series::circle_text_label("Label")) as Rc<dyn Labeller>;

    let data_set = Rc::new(vec![
        (start_date.timestamp_millis(), 1.0, None),
        (
            start_date.add(Duration::days(1)).timestamp_millis(),
            4.0,
            None,
        ),
        (
            start_date.add(Duration::days(2)).timestamp_millis(),
            3.0,
            None,
        ),
        (
            start_date.add(Duration::days(3)).timestamp_millis(),
            2.0,
            None,
        ),
        (
            start_date.add(Duration::days(4)).timestamp_millis(),
            5.0,
            Some(circle_text_labeller),
        ),
    ]);

    let h_scale = Rc::new(TimeScale::new(timespan, Duration::days(1))) as Rc<dyn Scale<Scalar = _>>;
    let v_scale = Rc::new(LinearScale::new(0.0..5.0, 1.0)) as Rc<dyn Scale<Scalar = _>>;

    let tooltip = Rc::from(series::y_tooltip()) as Rc<dyn Tooltipper<_, _>>;

    html! {
            <svg class="chart" viewBox={format!("0 0 {} {}", WIDTH, HEIGHT)} preserveAspectRatio="none">
                <Series<i64, f32>
                    series_type={Type::Line}
                    name="some-series"
                    data={data_set}
                    horizontal_scale={Rc::clone(&h_scale)}
                    horizontal_scale_step={Duration::days(2).num_milliseconds()}
                    tooltipper={Rc::clone(&tooltip)}
                    vertical_scale={Rc::clone(&v_scale)}
                    x={MARGIN} y={MARGIN} width={WIDTH - (MARGIN * 2.0)} height={HEIGHT - (MARGIN * 2.0)} />

                <Axis<f32>
                    name="some-y-axis"
                    orientation={Orientation::Left}
                    scale={Rc::clone(&v_scale)}
                    x1={MARGIN} y1={MARGIN} xy2={HEIGHT - MARGIN}
                    tick_len={TICK_LENGTH}
                    title={"Some Y thing".to_string()} />

                <Axis<i64>
                    name="some-x-axis"
                    orientation={Orientation::Bottom}
                    scale={Rc::clone(&h_scale)}
                    x1={MARGIN} y1={HEIGHT - MARGIN} xy2={WIDTH - MARGIN}
                    tick_len={TICK_LENGTH}
                    title={"Some X thing".to_string()} />

            </svg>
    }
}

如果通过 Props 传递 SeriesData,则需要提供一个 PartialEq 实现。由于 SeriesData 包含无法比较的闭包,Rust无法自动为您生成一个,但这不会成为问题;因为您在比较基于 Rc 的值时应该执行显式的指针比较;Rc 包含的引用是不可变的。Rc::ptr_eq 在此场景下是您的朋友。

话虽如此,您可能不会通过props传递 SeriesData,而是传递其他 Rc 基于模型导向的数据类型,该类型将被映射到它。使用 ptr_eq 仍然是正确的方法,因为您将获得性能优势。

柱状图

使用与上面相同的Yew视图方法代码,可以在 Series 标签内的 series_type 中编辑以使用 Bar 键显示柱状图。

<Series series_type={Type::Bar(BarType::Rise)} ... />

A rising bar chart

条形图也可以使用枚举变量 BarType 来“下降”而不是“上升”。这在使用负轴值时特别有用,其中条形图从 y = 0 或类似值开始下降。

当将 BarType 设置为 Drop 时,上面的相同数据将生成以下图形。

如图所示,条形图设置为从选定的侧面 数据点。由于轴的范围是从 0.05.0,第一个点位于 (26-Mar, 1.0),因此条形图从 5.0 下降到 1.0

<Series series_type={Type::Bar(BarType::Drop)} ... />

A dropping bar chart

此例的最后一个是使用负刻度和负值。在以下图形中,轴的范围是从 -5.00.0,第一个点是 (01-Apr, -1.0)

A dropping bar chart

散点图

examples/scatter 配置为输出基本的散点图。这是通过不同于 LineBar 图表的方法实现的。

贡献政策

我们欢迎通过 GitHub pull 请求从其原始作者那里接收贡献。请在任何 pull 请求中说明,该贡献是您原创的,并且您将根据项目的开源许可证将作品许可给项目。无论您是否明确声明,通过通过 pull 请求、电子邮件或其他方式提交任何版权材料,您同意根据项目的开源许可证许可材料,并保证您有合法的权利这样做。

许可证

此代码是开源软件,根据 Apache-2.0 许可证 授权。

© 版权所有 Titan Class P/L,2021

依赖项

~12–16MB
~278K SLoC