@quartic/bokehjs
Version:
Interactive, novel data visualization
120 lines (99 loc) • 3.51 kB
text/coffeescript
import {CategoricalMapper} from "../mappers/categorical_mapper"
import {LinearMapper} from "../mappers/linear_mapper"
import {LogMapper} from "../mappers/log_mapper"
import {Range1d} from "../ranges/range1d"
import {EQ, GE} from "core/layout/solver"
import {LayoutCanvas} from "core/layout/layout_canvas"
import {logger} from "core/logging"
import * as p from "core/properties"
export class CartesianFrame extends LayoutCanvas
type: 'CartesianFrame'
initialize: (attrs, options) ->
super(attrs, options)
= @
return null
_doc_attached: () ->
return null
contains: (vx, vy) ->
return (
vx >= and vx <= and
vy >= and vy <=
)
map_to_screen: (x, y, canvas, x_name='default', y_name='default') ->
vx = [x_name].v_map_to_target(x)
sx = canvas.v_vx_to_sx(vx)
vy = [y_name].v_map_to_target(y)
sy = canvas.v_vy_to_sy(vy)
return [sx, sy]
_get_ranges: (range, extra_ranges) ->
ranges = {}
ranges['default'] = range
if extra_ranges?
for name, extra_range of extra_ranges
ranges[name] = extra_range
return ranges
_get_mappers: (mapper_type, ranges, frame_range) ->
mappers = {}
for name, range of ranges
if range.type == "Range1d" or range.type == "DataRange1d"
if mapper_type == "log"
mapper_model = LogMapper
else
mapper_model = LinearMapper
range.mapper_hint = mapper_type
else if range.type == "FactorRange"
mapper_model = CategoricalMapper
else
logger.warn("unknown range type for range '#{name}': #{range}")
return null
mappers[name] = new mapper_model({
source_range: range
target_range: frame_range
})
return mappers
_configure_frame_ranges: () ->
= new Range1d({start: , end: + })
= new Range1d({start: , end: + })
_configure_mappers: () ->
=
=
=
=
_update_mappers: () ->
for name, mapper of
mapper.target_range =
for name, mapper of
mapper.target_range =
return null
{
h_range: () ->
v_range: () ->
x_ranges: () ->
y_ranges: () ->
x_mappers: () ->
y_mappers: () ->
}
{
extra_x_ranges: [ p.Any, {} ]
extra_y_ranges: [ p.Any, {} ]
x_range: [ p.Instance ]
y_range: [ p.Instance ]
x_mapper_type: [ p.String, 'auto' ]
y_mapper_type: [ p.String, 'auto' ]
}
get_constraints: () ->
constraints = []
constraints.push(GE())
constraints.push(GE())
constraints.push(GE())
constraints.push(GE())
constraints.push(GE())
constraints.push(GE())
constraints.push(EQ(, , [-1, ]))
constraints.push(EQ(, , [-1, ]))
return constraints