I am finally getting around to trying out Chaco so this question might be naive. Currently I am trying to plot a very large 8-bit (aka grey scale aka single channel) image of type numpy.uint8
. It seems no matter what I do the image comes out in color. Here is my code based on the image_plot.py example that comes with Chaco:
#!/usr/bin/env python
"""
Draws an simple RGB image
- Left-drag pans the plot.
- Mousewheel up and down zooms the plot in and out.
- Pressing "z" brings up the Zoom Box, and you can click-drag a rectangular
region to zoom. If you use a sequence of zoom boxes, pressing alt-left-arrow
and alt-right-arrow moves you forwards and backwards through the "zoom
history".
"""
# Major library imports
from numpy import zeros, uint8
# Enthought library imports
from enable.api import Component, ComponentEditor
from traits.api import HasTraits, Instance
from traitsui.api import Item, Group, View
# Chaco imports
from chaco.api import ArrayPlotData, Plot, ImageData
from chaco.tools.api import PanTool, ZoomTool
from chaco.tools.image_inspector_tool import ImageInspectorTool, \
ImageInspectorOverlay
#===============================================================================
# # Create the Chaco plot.
#===============================================================================
def _create_plot_component():
# Create some uint8 image data
imageSize = 10000
image = zeros((imageSize,imageSize), dtype=uint8)
for x in range(0,imageSize):
image[x,x] = 255
print image.shape
print type(image[0][0])
# Create a plot data obect and give it this data
pd = ArrayPlotData()
pd.set_data("imagedata", image)
# Create the plot
plot = Plot(pd, default_origin="top left")
plot.x_axis.orientation = "top"
img_plot = plot.img_plot("imagedata")[0]
# Tweak some of the plot properties
plot.bgcolor = "white"
# Attach some tools to the plot
plot.tools.append(PanTool(plot, constrain_key="shift"))
plot.overlays.append(ZoomTool(component=plot,
tool_mode="box", always_on=False))
# imgtool = ImageInspectorTool(img_plot)
# img_plot.tools.append(imgtool)
# plot.overlays.append(ImageInspectorOverlay(component=img_plot,
# image_inspector=imgtool))
return plot
#===============================================================================
# Attributes to use for the plot view.
size = (600, 600)
title="Simple image plot"
bg_color="lightgray"
#===============================================================================
# # Demo class that is used by the demo.py application.
#===============================================================================
class Demo(HasTraits):
plot = Instance(Component)
traits_view = View(
Group(
Item('plot', editor=ComponentEditor(size=size,
bgcolor=bg_color),
show_label=False),
orientation = "vertical"),
resizable=True, title=title
)
def _plot_default(self):
return _create_plot_component()
demo = Demo()
if __name__ == "__main__":
demo.configure_traits()
#--EOF---
What you're seeing is just pseudo-color: A 2D image needs some way to go from pixel values to "color" (grayscale is still color in this case). The default colormap is something colorful, but you can specify the colormap
keyword argument to get a grayscale image. Here's a simplified example:
import numpy as np
from enable.api import Component, ComponentEditor
from traits.api import HasTraits, Instance
from traitsui.api import UItem, View
from chaco.api import ArrayPlotData, Plot, gray
class Demo(HasTraits):
plot = Instance(Component)
traits_view = View(
UItem('plot', editor=ComponentEditor(size=(600, 600))),
resizable=True, title="Simple image plot"
)
def _plot_default(self):
image = np.random.random_integers(0, 255, size=(100, 100))
image = image.astype(np.uint8)
data = ArrayPlotData(imagedata=image)
plot = Plot(data, default_origin="top left")
plot.img_plot("imagedata", colormap=gray)
return plot
demo = Demo()
demo.configure_traits()