/usr/share/pyshared/chaco/label_axis.py is in python-chaco 4.1.0-1.
This file is owned by root:root, with mode 0o644.
The actual contents of the file can be viewed below.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 | """ Defines the LabelAxis class.
"""
# Major library imports
from traceback import print_exc
from numpy import array, float64, inf, searchsorted, take, unique
# Enthought library imports
from traits.api import Any, Str, List, Float
# Local, relative imports
from axis import PlotAxis
from label import Label
class LabelAxis(PlotAxis):
""" An axis whose ticks are labeled with text instead of numbers.
"""
# List of labels to use on tick marks.
labels = List(Str)
# The angle of rotation of the label. Only multiples of 90 are supported.
label_rotation = Float(0)
# List of indices of ticks
positions = Any # List(Float), Array
def _compute_tick_positions(self, gc, component=None):
""" Calculates the positions for the tick marks.
Overrides PlotAxis.
"""
if (self.mapper is None):
self._reset_cache()
self._cache_valid = True
return
datalow = self.mapper.range.low
datahigh = self.mapper.range.high
screenhigh = self.mapper.high_pos
screenlow = self.mapper.low_pos
if (datalow == datahigh) or (screenlow == screenhigh) or \
(datalow in [inf, -inf]) or (datahigh in [inf, -inf]):
self._reset_cache()
self._cache_valid = True
return
if not self.tick_generator:
return
# Get a set of ticks from the tick generator.
tick_list = array(self.tick_generator.get_ticks(datalow, datahigh,
datalow, datahigh,
self.tick_interval), float64)
# Find all the positions in the current range.
pos_index = []
pos = []
pos_min = None
pos_max = None
for i, position in enumerate(self.positions):
if datalow <= position <= datahigh:
pos_max = max(position, pos_max) if pos_max is not None else position
pos_min = min(position, pos_min) if pos_min is not None else position
pos_index.append(i)
pos.append(position)
if len(pos_index) == 0:
# No positions currently visible.
self._tick_positions = []
self._tick_label_positions = []
self._tick_label_list = []
return
# Use the ticks generated by the tick generator as a guide for selecting
# the positions to be displayed.
tick_indices = unique(searchsorted(pos, tick_list))
tick_indices = tick_indices[tick_indices < len(pos)]
tick_positions = take(pos, tick_indices)
self._tick_label_list = take(self.labels, take(pos_index, tick_indices))
if datalow > datahigh:
raise RuntimeError, "DataRange low is greater than high; unable to compute axis ticks."
mapped_label_positions = [((self.mapper.map_screen(pos)-screenlow) / \
(screenhigh-screenlow)) for pos in tick_positions]
self._tick_positions = [self._axis_vector*tickpos + self._origin_point \
for tickpos in mapped_label_positions]
self._tick_label_positions = self._tick_positions
return
def _compute_labels(self, gc):
"""Generates the labels for tick marks.
Overrides PlotAxis.
"""
try:
self.ticklabel_cache = []
for text in self._tick_label_list:
ticklabel = Label(text=text, font=self.tick_label_font,
color=self.tick_label_color,
rotate_angle=self.label_rotation)
self.ticklabel_cache.append(ticklabel)
self._tick_label_bounding_boxes = [array(ticklabel.get_bounding_box(gc), float64) for ticklabel in self.ticklabel_cache]
except:
print_exc()
return
|