archimedes_iocaml

This is a simple example of Archimedes, an OCaml library for plotting high-quality 2D graphs. You can embed graphs as PNG image in Jupyter notebooks.


In [1]:
#require "core";;
#use "archimedes_iocaml.ml";;
open Core ;;


/home/opam/.opam/4.04.1/lib/base/caml: added to search path
/home/opam/.opam/4.04.1/lib/base/caml/caml.cma: loaded
/home/opam/.opam/4.04.1/lib/base/shadow_stdlib: added to search path
/home/opam/.opam/4.04.1/lib/base/shadow_stdlib/shadow_stdlib.cma: loaded
/home/opam/.opam/4.04.1/lib/sexplib/0: added to search path
/home/opam/.opam/4.04.1/lib/sexplib/0/sexplib0.cma: loaded
/home/opam/.opam/4.04.1/lib/base: added to search path
/home/opam/.opam/4.04.1/lib/base/base.cma: loaded
/home/opam/.opam/4.04.1/lib/ocaml/unix.cma: loaded
/home/opam/.opam/4.04.1/lib/ocaml/bigarray.cma: loaded
/home/opam/.opam/4.04.1/lib/fieldslib: added to search path
/home/opam/.opam/4.04.1/lib/fieldslib/fieldslib.cma: loaded
/home/opam/.opam/4.04.1/lib/ppx_compare/runtime-lib: added to search path
/home/opam/.opam/4.04.1/lib/ppx_compare/runtime-lib/ppx_compare_lib.cma: loaded
/home/opam/.opam/4.04.1/lib/sexplib: added to search path
/home/opam/.opam/4.04.1/lib/sexplib/sexplib.cma: loaded
/home/opam/.opam/4.04.1/lib/variantslib: added to search path
/home/opam/.opam/4.04.1/lib/variantslib/variantslib.cma: loaded
/home/opam/.opam/4.04.1/lib/bin_prot/shape: added to search path
/home/opam/.opam/4.04.1/lib/bin_prot/shape/bin_shape_lib.cma: loaded
/home/opam/.opam/4.04.1/lib/bin_prot: added to search path
/home/opam/.opam/4.04.1/lib/bin_prot/bin_prot.cma: loaded
/home/opam/.opam/4.04.1/lib/ppx_hash/runtime-lib: added to search path
/home/opam/.opam/4.04.1/lib/ppx_hash/runtime-lib/ppx_hash_lib.cma: loaded
/home/opam/.opam/4.04.1/lib/ppx_inline_test/config: added to search path
/home/opam/.opam/4.04.1/lib/ppx_inline_test/config/inline_test_config.cma: loaded
/home/opam/.opam/4.04.1/lib/ppx_inline_test/runtime-lib: added to search path
/home/opam/.opam/4.04.1/lib/ppx_inline_test/runtime-lib/ppx_inline_test_lib.cma: loaded
/home/opam/.opam/4.04.1/lib/core_kernel/base_for_tests: added to search path
/home/opam/.opam/4.04.1/lib/core_kernel/base_for_tests/base_for_tests.cma: loaded
/home/opam/.opam/4.04.1/lib/jane-street-headers: added to search path
/home/opam/.opam/4.04.1/lib/jane-street-headers/jane_street_headers.cma: loaded
/home/opam/.opam/4.04.1/lib/ocaml/nums.cma: loaded
/home/opam/.opam/4.04.1/lib/num-top: added to search path
/home/opam/.opam/4.04.1/lib/num-top/num_top.cma: loaded
/home/opam/.opam/4.04.1/lib/num: added to search path
/home/opam/.opam/4.04.1/lib/ppx_assert/runtime-lib: added to search path
/home/opam/.opam/4.04.1/lib/ppx_assert/runtime-lib/ppx_assert_lib.cma: loaded
/home/opam/.opam/4.04.1/lib/ppx_bench/runtime-lib: added to search path
/home/opam/.opam/4.04.1/lib/ppx_bench/runtime-lib/ppx_bench_lib.cma: loaded
/home/opam/.opam/4.04.1/lib/ppx_expect/common: added to search path
/home/opam/.opam/4.04.1/lib/ppx_expect/common/expect_test_common.cma: loaded
/home/opam/.opam/4.04.1/lib/ppx_expect/config: added to search path
/home/opam/.opam/4.04.1/lib/ppx_expect/config/expect_test_config.cma: loaded
/home/opam/.opam/4.04.1/lib/ppx_expect/collector: added to search path
/home/opam/.opam/4.04.1/lib/ppx_expect/collector/expect_test_collector.cma: loaded
/home/opam/.opam/4.04.1/lib/stdio: added to search path
/home/opam/.opam/4.04.1/lib/stdio/stdio.cma: loaded
/home/opam/.opam/4.04.1/lib/typerep: added to search path
/home/opam/.opam/4.04.1/lib/typerep/typerep_lib.cma: loaded
/home/opam/.opam/4.04.1/lib/core_kernel: added to search path
/home/opam/.opam/4.04.1/lib/core_kernel/core_kernel.cma: loaded
/home/opam/.opam/4.04.1/lib/sexplib/unix: added to search path
/home/opam/.opam/4.04.1/lib/sexplib/unix/sexplib_unix.cma: loaded
/home/opam/.opam/4.04.1/lib/spawn: added to search path
/home/opam/.opam/4.04.1/lib/spawn/spawn.cma: loaded
/home/opam/.opam/4.04.1/lib/ocaml/threads: added to search path
/home/opam/.opam/4.04.1/lib/core: added to search path
/home/opam/.opam/4.04.1/lib/core/core.cma: loaded
/home/opam/.opam/4.04.1/lib/easy-format: added to search path
/home/opam/.opam/4.04.1/lib/easy-format/easy_format.cmo: loaded
/home/opam/.opam/4.04.1/lib/biniou: added to search path
/home/opam/.opam/4.04.1/lib/biniou/biniou.cma: loaded
/home/opam/.opam/4.04.1/lib/yojson: added to search path
/home/opam/.opam/4.04.1/lib/yojson/yojson.cmo: loaded
/home/opam/.opam/4.04.1/lib/ocaml/str.cma: loaded
/home/opam/.opam/4.04.1/lib/atd: added to search path
/home/opam/.opam/4.04.1/lib/atd/atd.cma: loaded
/home/opam/.opam/4.04.1/lib/atdgen: added to search path
/home/opam/.opam/4.04.1/lib/atdgen/atdgen.cma: loaded
/home/opam/.opam/4.04.1/lib/bytes: added to search path
/home/opam/.opam/4.04.1/lib/result: added to search path
/home/opam/.opam/4.04.1/lib/result/result.cma: loaded
/home/opam/.opam/4.04.1/lib/lwt: added to search path
/home/opam/.opam/4.04.1/lib/lwt/lwt.cma: loaded
/home/opam/.opam/4.04.1/lib/lwt/lwt-log.cma: loaded
/home/opam/.opam/4.04.1/lib/lwt/lwt-unix.cma: loaded
/home/opam/.opam/4.04.1/lib/ctypes: added to search path
/home/opam/.opam/4.04.1/lib/ctypes/ctypes.cma: loaded
/home/opam/.opam/4.04.1/lib/ctypes/ctypes-top.cma: loaded
/home/opam/.opam/4.04.1/lib/ctypes/ctypes-foreign-base.cma: loaded
/home/opam/.opam/4.04.1/lib/ctypes/ctypes-foreign-unthreaded.cma: loaded
/home/opam/.opam/4.04.1/lib/iocaml-kernel: added to search path
/home/opam/.opam/4.04.1/lib/iocaml-kernel/iocaml_lib.cma: loaded
/home/opam/.opam/4.04.1/lib/cairo2: added to search path
/home/opam/.opam/4.04.1/lib/cairo2/cairo2.cma: loaded
/home/opam/.opam/4.04.1/lib/ocaml/dynlink.cma: loaded
/home/opam/.opam/4.04.1/lib/ocaml/camlp4: added to search path
/home/opam/.opam/4.04.1/lib/archimedes: added to search path
/home/opam/.opam/4.04.1/lib/archimedes/archimedes_internals.cma: loaded
/home/opam/.opam/4.04.1/lib/archimedes/archimedes_toploop.cma: loaded
Module Archimedes loaded and aliased as A.
/home/opam/.opam/4.04.1/lib/archimedes/archimedes_cairo.cma: loaded
module Archimedes_iocaml : sig  end

Plot a function

You can plot an OCaml function: $y = \sin(x)$.


In [2]:
let vp = A.init ~w:500. ~h:300. ["iocaml"] in
A.Axes.box vp ;
A.set_color vp A.Color.red ;
A.fx vp sin 0. 10. ;
A.close vp


File "[2]", line 4, characters 8-11:
Warning 3: deprecated: Core.sin
[since 2016-07] Use [Float.sin]
Out[2]:
- : unit = ()

Plot data points

Plot timeseries data of USD-EUR foreign exchange rates.

Data source: https://fred.stlouisfed.org/series/DEXUSEU


In [3]:
let zone = Time.Zone.utc ;;  (* Time zone is UTC *)

let days_of_string date_str =
    let date = Date.of_string date_str in                   (* Date (YYYY-MM-DD) *)
    Time.of_date_ofday ~zone date (Time.Ofday.start_of_day) (* DateTime (YYYY-MM-DD 00:00:00) *)
    |> Time.to_span_since_epoch                             (* # of seconds since poch *)
    |> Time.Span.to_day                                     (* # of days since epoch *)
;;
let string_of_days days =
    Time.Span.of_day days        (* # of days since epoch *)
    |> Time.of_span_since_epoch  (* # of seconds since epoch *)
    |> Time.to_date ~zone        (* DateTime (YYYY-MM-DD HH:MM:SS) *)
    |> Date.to_string            (* Date (YYYY-MM-DD) *)
;;
let usd_eur =
    In_channel.read_lines "datasets/DEXUSEU.csv"
    |> List.tl_exn                      (* Remove the CSV header line *)
    |> List.filter_map
        ~f:(fun line ->
            let (date_str, rate_str) = String.lsplit2_exn ~on:',' line in (* Split a CSV line by comma *)
            try Some (days_of_string date_str, float_of_string rate_str)
            with _ -> None)
in
let vp = A.init ~w:800. ~h:300. ["iocaml"] in
A.Axes.box vp ~tics:(A.Tics.Auto A.Tics.No_label) ;
A.Axes.x vp ~grid:true ~tics:(A.Tics.Auto (A.Tics.Custom string_of_days)) ;
A.Axes.y vp ~grid:true ;
A.set_color vp A.Color.red ;
A.List.xy_pairs vp ~style:`Lines usd_eur ;
A.close vp


Out[3]:
val zone : Core.Time.Zone.t = <abstr>
Out[3]:
val days_of_string : string -> Core_kernel__.Import.float = <fun>
Out[3]:
val string_of_days : Core_kernel__.Import.float -> string = <fun>
Out[3]:
- : unit = ()

In [ ]: