#plot #polars #chart #data-analysis #plotly

plotlars

Plotlars 是一个旨在促进 Polars 数据分析库与可视化库之间集成的 Rust 库

5 个版本

新版本 0.2.3 2024年8月25日
0.2.2 2024年8月25日
0.2.1 2024年8月25日
0.2.0 2024年8月25日
0.1.0 2024年7月27日

#41 in 可视化

Download history 93/week @ 2024-07-23 21/week @ 2024-07-30 329/week @ 2024-08-20

每月357次下载

MIT 许可协议

76KB
1.5K SLoC

Plotlars

Crates.io docs.rs License

Plotlars 是一个多功能的 Rust 库,它作为 Plotlycrate 的包装器,在强大的 Polars 数据分析库和 Plotly 之间架起桥梁。它简化了从数据帧创建可视化的过程,使开发者能够专注于数据洞察,而不是绘图创建的复杂性。

动机

Plotlars 的创建是由简化 Rust 中创建复杂绘图过程的需求驱动的,尤其是在使用强大的 Polars 数据处理库时。生成可视化通常需要大量的样板代码和深入了解绘图库(Plotly)和数据结构。这种复杂性可能是一个重大的障碍,尤其是对于需要专注于分析和解释数据而不是与复杂的绘图逻辑作斗争的用户。

为了说明这一点,考虑以下在没有 Plotlars 的情况下创建散点图的例子

没有 Plotlars

use plotly::{
    common::*,
    layout::*,
    Plot,
    Scatter,
};

use polars::prelude::*;

fn main() {
    let dataset = LazyCsvReader::new("data/penguins.csv")
        .finish().unwrap()
        .select([
            col("species").cast(
                DataType::Categorical(
                    None,
                    CategoricalOrdering::default()
                )
            ),
            col("flipper_length_mm").cast(DataType::Int16),
            col("body_mass_g").cast(DataType::Int16),
        ])
        .collect().unwrap();

    let group_column = "species";
    let x = "body_mass_g";
    let y = "flipper_length_mm";

    let groups = dataset
        .column(group_column).unwrap()
        .unique().unwrap();

    let layout = Layout::new()
        .title(Title::new("Penguin Flipper Length vs Body Mass"))
        .x_axis(Axis::new().title(Title::new("Body Mass (g)")))
        .y_axis(Axis::new().title(Title::new("Flipper Length (mm)")))
        .legend(Legend::new().title(Title::new("Species")));

    let mut plot = Plot::new();
    plot.set_layout(layout);

    for group in groups.iter() {
        let group = group.get_str().unwrap();

        let data = dataset
            .clone()
            .lazy()
            .filter(col(group_column).eq(lit(group)))
            .collect().unwrap();

        let x = data
            .column(x).unwrap()
            .i16().unwrap()
            .to_vec();

        let y = data
            .column(y).unwrap()
            .i16().unwrap()
            .to_vec();

        let trace = Scatter::default()
            .x(x)
            .y(y)
            .name(group)
            .mode(Mode::Markers)
            .marker(Marker::new().size(10).opacity(0.5));

        plot.add_trace(trace);
    }

    plot.show();
}

在这个例子中,创建散点图涉及到编写大量的代码来手动处理数据和配置图形,包括按类别分组数据和设置图形布局。

使用 Plotlars

现在,将这个与使用 Plotlars 创建的相同图形进行比较

use plotlars::{
    ScatterPlot,
    Plot,
    Text,
};

use polars::prelude::*;

fn main() {
    let dataset = LazyCsvReader::new("data/penguins.csv")
        .finish().unwrap()
        .select([
            col("species").cast(
                DataType::Categorical(
                    None,
                    CategoricalOrdering::default()
                )
            ),
            col("flipper_length_mm").cast(DataType::Int16),
            col("body_mass_g").cast(DataType::Int16),
        ])
        .collect().unwrap();

    ScatterPlot::builder()
        .data(&dataset)
        .x("body_mass_g")
        .y("flipper_length_mm")
        .group("species")
        .size(10)
        .opacity(0.5)
        .plot_title(Text::from("Penguin Flipper Length vs Body Mass"))
        .x_title(Text::from("Body Mass (g)"))
        .y_title(Text::from("Flipper Length (mm)"))
        .legend_title(Text::from("Species"))
        .build()
        .plot();
}

这是输出结果

Plot example

使用 Plotlars,相同的散点图可以用显著更少的代码创建。该库抽象化了处理单个图形组件的复杂性,并允许用户指定高级图形特征。这种简化的方法不仅节省了时间,而且减少了错误的可能性,并使代码更易于阅读和维护。

安装

cargo add plotlars

功能

  • 无缝集成 Polars:利用 Polars 的强大功能进行高效的数据操作和分析。
  • 支持多种图形类型:轻松创建条形图、折线图、散点图和其他图形类型。
  • 自定义:使用直观的 API 修改图形外观。

许可协议

本项目采用 MIT 许可协议。请参阅 LICENSE.txt 文件以获取详细信息。

致谢

  • Polars:提供快速高效的数据操作库。
  • Plotly:提供可视化库背后的灵感和想法。
  • Rust 社区:为这个出色的编程语言提供支持和开发。

依赖项

~32-62MB
~1M SLoC