Skip to content

Instantly share code, notes, and snippets.

@0racle
Created April 11, 2017 14:28
Show Gist options
  • Star 4 You must be signed in to star a gist
  • Fork 1 You must be signed in to fork a gist
  • Save 0racle/db70e910a3eef3f49d99a1f1b561e8d7 to your computer and use it in GitHub Desktop.
Save 0racle/db70e910a3eef3f49d99a1f1b561e8d7 to your computer and use it in GitHub Desktop.
Matplotlib in Perl6

These are the modules I wrote while playing around with Python's Matplotlib in Perl6.

I blogged about the whole experience here

use Inline::Python;
my $py = Inline::Python.new();
$py.run('import matplotlib.pyplot');
class Matplotlib::Mlab {
method FALLBACK($name, |c) {
$py.call('matplotlib.mlab', $name, |c)
}
}
class Matplotlib::Plot::Style {
method use($arg) {
$py.run("matplotlib.pyplot.style.use('$arg')", :eval)
}
method available {
$py.run("matplotlib.pyplot.style.available", :eval)
}
method FALLBACK($name, |c) {
$py.call('matplotlib.pyplot.style', $name, |c)
}
}
class Matplotlib::Plot {
method cm {
class {
method FALLBACK($name, $idx) {
$py.run("matplotlib.pyplot.cm.{$name}($idx)", :eval);
}
}.new();
}
method style {
Matplotlib::Plot::Style.new
}
method rc-params {
$py.run("dict(matplotlib.pyplot.rcParams)", :eval);
}
method rcParams {
class {
multi method AT-KEY('axes.prop_cycle') {
$py.run(
"list(matplotlib.pyplot.rcParams['axes.prop_cycle'])", :eval
).map(|*.values);
}
multi method AT-KEY($key) {
$py.run("matplotlib.pyplot.rcParams['$key']", :eval);
}
multi method ASSIGN-KEY($key, Str $value) {
$py.run("matplotlib.pyplot.rcParams['$key'] = '$value'");
return $value;
}
multi method ASSIGN-KEY($key, $value) {
$py.run("matplotlib.pyplot.rcParams['$key'] = $value");
return $value;
}
}.new();
}
method FALLBACK($name, |c) {
$py.call('matplotlib.pyplot', $name, |c)
}
}
class Matplotlib {
method FALLBACK($name, |c) {
$py.call('matplotlib', $name, |c)
}
}
class Numpl::Random {
method randn($n) {
sqrt( -2 × log(rand) ) × cos( τ × rand ) xx $n;
}
sub norm ($m, $s) {
my $r = sqrt -2 * log rand;
my $t = τ * rand;
$r * cos($t) * $s + $m;
}
}
class Numpl {
proto method linspace(Numeric $start, Numeric $end, Int $steps?) { * }
multi method linspace($start, $end, 0 ) { Empty }
multi method linspace($start, $end, 1 ) { $start }
multi method linspace($start, $end, $steps = 50, :$endpoint = True) {
if $endpoint {
my $step = ( $end - $start ) ÷ ( $steps - 1 );
return $start, * + $step ... * =~= $end
}
else {
my $step = ( $end - $start ) ÷ $steps;
return $start, * + $step ...^ * =~= $end
}
}
method random {
state $r = Numpl::Random.new();
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment