In [ ]:
#include <algorithm>
#include <random>
#include <vector>

#include "xplot/xfigure.hpp"
#include "xplot/xmarks.hpp"
#include "xplot/xaxes.hpp"

auto randn(std::size_t n)
{
    std::vector<double> output(n);
    std::random_device rd;
    std::mt19937 gen(rd());
    std::normal_distribution<> dis(5, 2);

    std::for_each(output.begin(), output.end(), [&dis, &gen](auto& v){v = dis(gen);});

    return output;
}

std::size_t data_size = 200;
std::vector<double> data_x(data_size);
std::iota(data_x.begin(), data_x.end(), 0);
std::vector<double> data_y = randn(data_size);
std::vector<double> data_c = randn(data_size);

xpl::linear_scale scale_x, scale_y;
xpl::linear_scale scale_size;

auto scatter = xpl::scatter::initialize(scale_x, scale_y, scale_size)
    .x(data_x)
    .y(data_y)
    .size(data_c)
    .stroke("black")
    .default_size(128)
    .enable_move(true)
    .colors(std::vector<xtl::xoptional<std::string>>{"orangered"})
    .finalize();

xpl::axis axis_x(scale_x), axis_y(scale_y);
axis_x.label = "x";
axis_y.label = "y";
axis_y.orientation = "vertical";
axis_y.side = "left";

xpl::figure fig;
fig.padding_x = 0.025;
fig.add_mark(scatter);
fig.add_axis(axis_x);
fig.add_axis(axis_y);
fig