############ How Do I...? ############ .. note:: This section is currently under active development. Basics ====== *How do I...* * render data to an image file? :: def save_plot(plot, filename, width, height): plot.outer_bounds = [width, height] plot.do_layout(force=True) gc = PlotGraphicsContext((width, height), dpi=72) gc.render_component(plot) gc.save(filename) * integrate a Chaco plot into my WX app? :: import wx from scipy import arange from scipy.special import jn from chaco.api import HPlotContainer, create_line_plot from enable.wx_backend.api import Window class PlotFrame(wx.Frame): def __init__(self, *args, **kw): kw["size"] = (850, 550) wx.Frame.__init__( *(self,) + args, **kw ) self.plot_window = Window(self, component=self._create_plot()) sizer = wx.BoxSizer(wx.HORIZONTAL) sizer.Add(self.plot_window.control, 1, wx.EXPAND) self.SetSizer(sizer) self.SetAutoLayout(True) self.Show(True) return def _create_plot(self): x = arange(-5.0, 15.0, 20.0/100) y = jn(0, x) plot = create_line_plot((x,y), bgcolor="white", add_grid=True, add_axis=True) container = HPlotContainer(spacing=20, padding=50, bgcolor="lightgray") container.add(plot) return container if __name__ == "__main__": app = wx.PySimpleApp() frame = PlotFrame(None) app.MainLoop() * integrate a Chaco plot into my QT app? * integrate a Chaco plot into my Traits UI? :: import numpy from chaco.api import Plot, ArrayPlotData from enable.component_editor import ComponentEditor from traits.api import HasTraits, Instance from traitsui.api import Item, View class MyPlot(HasTraits): plot = Instance(Plot) traits_view = View(Item('plot', editor=ComponentEditor())) def __init__(self, index, data_series, **kw): super(MyPlot, self).__init__(**kw) plot_data = ArrayPlotData(index=index) plot_data.set_data('data_series', data_series) self.plot = Plot(plot_data) self.plot.plot(('index', 'data_series')) index = numpy.array([1,2,3,4,5]) data_series = index**2 my_plot = MyPlot(index, data_series) my_plot.configure_traits() * make an application to render many streams of data? :: def plot_several_series(index, series_list): plot_data = ArrayPlotData(index=index) plot = Plot(plot_data) for i, data_series in enumerate(series_list): series_name = "series_%d" % i plot_data.set_data(series_name, data_series) plot.plot(('index', series_name)) * make a plot the right size? :: def resize_plot(plot, width, height): plot.outer_bounds = [width, height] * copy a plot the the clipboard? :: def copy_to_clipboard(plot): # WX specific, though QT implementation is similar using # QImage and QClipboard import wx width, height = plot.outer_bounds gc = PlotGraphicsContext((width, height), dpi=72) gc.render_component(plot_component) # Create a bitmap the same size as the plot # and copy the plot data to it bitmap = wx.BitmapFromBufferRGBA(width+1, height+1, gc.bmp_array.flatten()) data = wx.BitmapDataObject() data.SetBitmap(bitmap) if wx.TheClipboard.Open(): wx.TheClipboard.SetData(data) wx.TheClipboard.Close() else: wx.MessageBox("Unable to open the clipboard.", "Error") Layout and Rendering ==================== *How do I...* * put multiple plots in a single window? * change the background color? :: def make_black_plot(index, data_series): plot_data = ArrayPlotData(index=index) plot_data.set_data('data_series', data_series) plot = Plot(plot_data, bgcolor='black') plot.plot(('index', 'data_series')) def change_bgcolor(plot): plot.bgcolor = 'black' * turn off borders? :: def make_borderless_plot(index, data_series): plot_data = ArrayPlotData(index=index) plot_data.set_data('data_series', data_series) plot = Plot(plot_data, border_visible=False) plot.plot(('index', 'data_series')) def change_to_borderless_plot(plot): plot.border_visible = False Writing Components ================== *How do I...* * compose multiple renderers? * write a custom renderer? * write a custom overlay/underlay? * write a custom tool? * write a new container? Advanced ======== *How do I...* * properly change/override draw dispatch? * modify event dispatch? * customize backbuffering? * embed custom/native WX widgets on the plot?