surfaceplot/
surfaceplot.rs

1use std::iter;
2
3use ndarray::Array;
4use polars::prelude::*;
5
6use plotlars::{ColorBar, Lighting, Palette, Plot, SurfacePlot, Text};
7
8fn main() {
9    let n: usize = 100;
10    let (x_base, _): (Vec<f64>, Option<usize>) =
11        Array::linspace(-10., 10., n).into_raw_vec_and_offset();
12    let (y_base, _): (Vec<f64>, Option<usize>) =
13        Array::linspace(-10., 10., n).into_raw_vec_and_offset();
14
15    let x = x_base
16        .iter()
17        .flat_map(|&xi| iter::repeat_n(xi, n))
18        .collect::<Vec<_>>();
19
20    let y = y_base
21        .iter()
22        .cycle()
23        .take(n * n)
24        .cloned()
25        .collect::<Vec<_>>();
26
27    let z = x_base
28        .iter()
29        .flat_map(|i| {
30            y_base
31                .iter()
32                .map(|j| 1.0 / (j * j + 5.0) * j.sin() + 1.0 / (i * i + 5.0) * i.cos())
33                .collect::<Vec<_>>()
34        })
35        .collect::<Vec<_>>();
36
37    let dataset = df![
38        "x" => &x,
39        "y" => &y,
40        "z" => &z,
41    ]
42    .unwrap();
43
44    SurfacePlot::builder()
45        .data(&dataset)
46        .x("x")
47        .y("y")
48        .z("z")
49        .plot_title(Text::from("Surface Plot").font("Arial").size(18))
50        .color_bar(&ColorBar::new().border_width(1))
51        .color_scale(Palette::Cividis)
52        .reverse_scale(true)
53        .lighting(
54            &Lighting::new()
55                .position(1, 0, 0)
56                .ambient(1.0)
57                .diffuse(1.0)
58                .fresnel(1.0)
59                .roughness(1.0)
60                .specular(1.0),
61        )
62        .opacity(0.5)
63        .build()
64        .plot();
65}