Как мне наложить два изображения с помощью Chaco?

Примечание: я сам отвечу на этот вопрос, чтобы помочь другим людям, которые столкнутся с этой проблемой в будущем. Не стесняйтесь отправлять свои собственные ответы, если хотите, но знайте, что они уже даны ответы!

Как я могу наложить маскированное изображение с одной цветовой картой на другое изображение с другой цветовой картой в Chaco? Кроме того, как я могу добавить цветные полосы для каждого из них?

2 ответа

Наложение изображений таким образом в Chaco не очень хорошо документировано, но определенно возможно. Во-первых, как вы рисуете замаскированное изображение с помощью chaco? При построении с Plot().img_plot()Чако использует np.nan значения в виде прозрачных пикселей. Например, построение графика:

img = np.eye(100)
img[img==0] = np.nan

построил бы диагональную линию с прозрачным фоном.

Но как вы на самом деле накладываете это изображение на другое изображение?

Есть два основных способа сделать это.

  1. Сделайте два отдельных графика и сложите их, используя OverlayPlotContainer
  2. Сделайте один сюжет и нанесите оба на одном участке

Преимущество второго метода состоит в том, что оба изображения будут использовать одни и те же оси. Также, если вы строите второе изображение на том же графике, что и первое, оно сохраняет такое же соотношение сторон пикселя. Это означает, что если вы строите изображение 100x100, а затем накладываете поверх него изображение 50x50, наложенное изображение займет всего 25% от всего графика, начиная с (0,0).

Со вторым методом есть некоторые проблемы, поэтому я объясню, как их исправить.

Когда вы строите несколько изображений на одном Plot объект (используя img_plot()), они оба будут использовать один и тот же color_mapper по умолчанию. Это означает, что оба будут масштабироваться до одинакового диапазона. Это может быть не обязательным результатом, поэтому вы должны создать новые color_mappers для обоих изображений.

Вот пример кода с TraitsUI, который был адаптирован из кода Qt.

from traits.api import HasTraits, Instance
from traitsui.api import Item, View
from enable.api import ComponentEditor
from chaco.api import ArrayPlotData, Plot, ColorBar, LinearMapper, HPlotContainer, DataRange1D, ImageData
import chaco.default_colormaps
#
import numpy as np

class ImagePlot(HasTraits):
    plot = Instance(HPlotContainer)

    traits_view = View(
        Item('plot', editor=ComponentEditor(), show_label=False), width=500, height=500, resizable=True, title="Chaco Plot")

    def _plot_default(self):
        bottomImage = np.reshape(np.repeat(np.linspace(0, 5, 100),100), (100,100))
        topImage = np.eye(50)
        topImage = topImage*np.reshape(np.repeat(np.linspace(-2, 2, 50),50), (50,50))
        topImage[topImage==0] = np.nan
        #
        bottomImageData = ImageData()
        bottomImageData.set_data(bottomImage)
        #
        topImageData = ImageData()
        topImageData.set_data(topImage)
        #
        plotData = ArrayPlotData(imgData=bottomImageData, imgData2=topImageData)
        plot = Plot(plotData, name='My Plot')
        plot.img_plot("imgData")
        plot.img_plot("imgData2")
        # Note: DO NOT specify a colormap in the img_plot!
        plot.aspect_ratio = 1.0
        #
        bottomRange = DataRange1D()
        bottomRange.sources = [plotData.get_data("imgData")]
        topRange = DataRange1D()
        topRange.sources = [plotData.get_data("imgData2")]
        plot.plots['plot0'][0].color_mapper = chaco.default_colormaps.gray(bottomRange)
        plot.plots['plot1'][0].color_mapper = chaco.default_colormaps.jet(topRange)
        #
        colormapperBottom = plot.plots['plot0'][0].color_mapper
        colormapperTop = plot.plots['plot1'][0].color_mapper
        #
        colorbarBottom = ColorBar(index_mapper=LinearMapper(range=colormapperBottom.range), color_mapper=colormapperBottom, orientation='v', resizable='v', width=30, padding=20)
        colorbarBottom.padding_top = plot.padding_top
        colorbarBottom.padding_bottom = plot.padding_bottom
        #
        colorbarTop = ColorBar(index_mapper=LinearMapper(range=colormapperTop.range), color_mapper=colormapperTop, orientation='v', resizable='v', width=30, padding=20)
        colorbarTop.padding_top = plot.padding_top
        colorbarTop.padding_bottom = plot.padding_bottom
        #
        container = HPlotContainer(resizable = "hv", bgcolor='transparent', fill_padding=True, padding=0)
        container.spacing = 0
        container.add(plot)
        container.add(colorbarBottom)
        container.add(colorbarTop)
        #
        return container

if __name__ == "__main__":
    ImagePlot().configure_traits()

Наложение графических изображений в Chaco

Я не беру 100% за это, с помощью быстрого поиска в Интернете, я обнаружил, что вы можете сделать простое наложение с кодом ниже:

Источник где нашел:

http://docs.enthought.com/chaco/user_manual/containers.html

Код ссылки:

class OverlayImageExample(HasTraits):

plot = Instance(OverlayImage)

traits_view = View(
    Item('plot', editor=ComponentEditor(), show_label=False),
    width=800, height=600, resizable=True
)

def _plot_default(self):
    # Create data
    x = linspace(-5, 15.0, 100)
    y = jn(3, x)
    pd = ArrayPlotData(index=x, value=y)

    zoomable_plot = Plot(pd)
    zoomable_plot.plot(('index', 'value'),
                       name='external', color='red', line_width=3)

    # Attach tools to the plot
    zoom = ZoomTool(component=zoomable_plot,
                    tool_mode="box", always_on=False)
    zoomable_plot.overlays.append(zoom)
    zoomable_plot.tools.append(PanTool(zoomable_plot))

    # Create a second inset plot, not resizable, not zoom-able
    inset_plot = Plot(pd)
    inset_plot.plot(('index', 'value'), color='blue')
    inset_plot.set(resizable = '',
                   bounds = [250, 150],
                   position = [450, 350],
                   border_visible = True
                   )

    # Create a container and add our plots
    container = OverlayPlotContainer()
    container.add(zoomable_plot)
    container.add(inset_plot)
    return container
Другие вопросы по тегам