Chart-GGPlot
view release on metacpan or search on metacpan
lib/Chart/GGPlot/Scale/Continuous.pm view on Meta::CPAN
my $pal = $self->palette->($uniq);
my $scaled = $pal->slice( match( $new_p, $uniq ) );
return $scaled->setbadtoval( $self->na_value );
}
method dimension ( $expand = pdl([0, 0, 0, 0]) ) {
return expand_range4( $self->get_limits(), $expand );
}
# return arrayref of breaks
method get_breaks ( $limits=$self->get_limits ) {
if ( $limits->isempty ) {
$limits = $self->get_limits();
}
return pdl( [] ) if $self->isempty;
return null if ( $self->breaks->$_call_if_object('isempty') );
# Limits in transformed space need to be converted back to data space
$limits = $self->trans->inverse->($limits);
my $breaks;
if ( zero_range($limits) ) {
$breaks = pdl( [ $limits->at(0) ] );
}
elsif ( not defined $self->breaks ) {
$breaks = $self->trans->breaks->($limits);
}
else {
$breaks = call_if_coderef( $self->breaks, $limits );
}
# Breaks in data space need to be converted back to transformed space
# And any breaks outside the dimensions need to be flagged as missing
$breaks = censor( $self->trans->transform->($breaks),
$self->trans->transform->($limits), 0 );
return $breaks;
}
method get_breaks_minor (
$n = 2,
$b = $self->break_positions,
$limits = $self->get_limits()
) {
if ( $limits->isempty ) {
$limits = $self->get_limits();
}
return pdl( [] ) if ( zero_range($limits) );
return null if ( $self->minor_breaks->$_call_if_object('isempty') );
my $breaks;
if ( not defined $self->minor_breaks ) {
$breaks =
$b->isempty
? null
: $self->trans->minor_breaks->( $b, $limits, $n );
}
elsif ( Ref::Util::is_coderef( $self->minor_breaks ) ) {
# Find breaks in data space, and convert to numeric
$breaks = $self->minor_breaks->( $self->trans->inverse->($limits) );
$breaks = $self->trans->transform->($breaks);
}
else {
$breaks = $self->trans->transform->( $self->minor_breaks );
}
# Any minor breaks outside the dimensions need to be thrown away
return discard( $breaks, $limits );
}
method get_labels ( $breaks = $self->get_breaks ) {
return null if ( $breaks->isempty );
$breaks = $self->trans->inverse->($breaks);
my $labels;
if ( not defined $self->labels ) {
$labels = $self->trans->format->($breaks);
}
elsif ( $self->labels->$_call_if_object('isempty') ) {
return PDL::SV->new( [] );
}
else {
$labels = call_if_coderef( $self->labels, $breaks );
}
if ( $labels->length != $breaks->length ) {
die("Breaks and labels are different lengths");
}
return $labels;
}
method break_info ($range=$self->dimension) {
if ( $range->$_DOES('Chart::GGPlot::Range') ) {
$range = $range->range;
}
if ( $range->isempty ) {
$range = $self->dimension;
}
# major breaks and labels
my $major = $self->get_breaks($range);
my $labels = $self->get_labels($major);
# drop oob breaks/labels by testing major == NA
if ( not $labels->isempty and $major->badflag ) {
$labels = $labels->where( $major->isgood );
}
if ( not $major->isempty and $major->badflag ) {
$major = $major->where( $major->isgood );
}
my $minor = $self->get_breaks_minor( 2, $major, $range );
unless ( $minor->isempty and $minor->badflag ) {
$minor = $minor->where( $minor->isgood );
}
# rescale to [0, 1]
( run in 2.116 seconds using v1.01-cache-2.11-cpan-39bf76dae61 )