pandrs 0.1.0-beta.2

A high-performance DataFrame library for Rust, providing pandas-like API with advanced features including SIMD optimization, parallel processing, and distributed computing capabilities
Documentation
#[cfg(feature = "visualization")]
use pandrs::vis::{DataFramePlotExt, SeriesPlotExt};
#[cfg(feature = "visualization")]
use pandrs::vis::{PlotConfig, PlotType};
#[cfg(feature = "visualization")]
use pandrs::{DataFrame, Series};
#[cfg(feature = "visualization")]
use rand::{rng, Rng};

#[cfg(not(feature = "visualization"))]
fn main() {
    println!("This example requires the 'visualization' feature flag to be enabled.");
    println!("Please recompile with:");
    println!("  cargo run --example visualization_plotters_example --features \"visualization\"");
}

#[cfg(feature = "visualization")]
#[allow(clippy::result_large_err)]
fn main() -> Result<(), Box<dyn std::error::Error>> {
    // Generate random data
    let mut rng = rng();
    let x: Vec<i32> = (0..100).collect();
    let y1: Vec<f64> = (0..100)
        .map(|i| i as f64 + rng.random_range(-5.0..5.0))
        .collect();
    let y2: Vec<f64> = (0..100)
        .map(|i| i as f64 * 0.8 + 10.0 + rng.random_range(-3.0..3.0))
        .collect();
    let y3: Vec<f64> = (0..100)
        .map(|i| 50.0 + 30.0 * (i as f64 * 0.1).sin())
        .collect();

    // Single series line chart
    let series1 = Series::new(y1.clone(), Some("Data1".to_string()))?;

    println!("Creating line chart...");
    series1.line_plot("line_chart.png", Some("Line Chart"))?;
    println!("-> Saved to line_chart.png");

    // Histogram
    let hist_data: Vec<f64> = (0..1000).map(|_| rng.random_range(-50.0..50.0)).collect();
    let hist_series = Series::new(hist_data, Some("Distribution".to_string()))?;

    println!("Creating histogram...");
    hist_series.histogram("histogram.png", Some(20), Some("Histogram"))?;
    println!("-> Saved to histogram.png");

    // Use DataFrame for multiple series chart
    let mut df = DataFrame::new();
    df.add_column("X".to_string(), Series::new(x, Some("X".to_string()))?)?;
    df.add_column(
        "Data1".to_string(),
        Series::new(y1, Some("Data1".to_string()))?,
    )?;
    df.add_column(
        "Data2".to_string(),
        Series::new(y2, Some("Data2".to_string()))?,
    )?;
    df.add_column(
        "Data3".to_string(),
        Series::new(y3.clone(), Some("Data3".to_string()))?,
    )?;

    println!("Creating scatter plot...");
    df.scatter_xy("X", "Data1", "scatter_chart.png", Some("Scatter Plot"))?;
    println!("-> Saved to scatter_chart.png");

    println!("Creating multiple series line chart...");
    df.multi_line_plot(
        &["Data1", "Data2", "Data3"],
        "multi_line_chart.svg",
        Some("Multiple Series Line Chart"),
    )?;
    println!("-> Saved to multi_line_chart.svg");

    // Bar chart
    let bar_values = vec![15, 30, 25, 40, 20];
    let categories = vec!["A", "B", "C", "D", "E"];

    let mut bar_df = DataFrame::new();
    bar_df.add_column(
        "Category".to_string(),
        Series::new(categories, Some("Category".to_string()))?,
    )?;
    bar_df.add_column(
        "Value".to_string(),
        Series::new(bar_values.clone(), Some("Value".to_string()))?,
    )?;

    println!("Creating bar chart...");
    // Create bar chart using index
    // Convert i32 to f32 for compatibility
    let bar_values_f32: Vec<f32> = bar_values.iter().map(|&x| x as f32).collect();
    let bar_series = Series::new(bar_values_f32, Some("Value".to_string()))?;
    let bar_config = PlotConfig {
        title: "Bar Chart".to_string(),
        plot_type: PlotType::Line, // Use Line type for now
        ..PlotConfig::default()
    };
    bar_series.plot("bar_chart.png", bar_config)?;
    println!("-> Saved to bar_chart.png");

    println!("Creating area chart...");
    // Convert f64 to f32 for compatibility
    let y3_f32: Vec<f32> = y3.iter().map(|&x| x as f32).collect();
    let area_series = Series::new(y3_f32, Some("Waveform".to_string()))?;
    let area_config = PlotConfig {
        title: "Area Chart".to_string(),
        plot_type: PlotType::Line, // Use Line type for now
        ..PlotConfig::default()
    };
    area_series.plot("area_chart.png", area_config)?;
    println!("-> Saved to area_chart.png");

    println!("All charts have been generated.");
    Ok(())
}