簡體   English   中英

Chaco 堆疊條 plot 每個條和段都有不同的顏色

[英]Chaco stacked bar plot with different colour for each bar and segment

我試圖在 Chaco 堆疊條 plot 中控制每個條每個條段的顏色。

例如,運行 Chaco 的堆疊條 plot 示例給出,

標准 Chaco 堆積條形圖

我怎么把它變成這個怪物?

修改后的 Chaco 堆積條形圖,每個條形圖和線段都有自定義顏色

我可以看到 Chaco 有ColourMapped Scatter Plot可以控制每個點。 我需要這種行為,但需要條形圖。 有沒有一種快速的方法來做到這一點?

這是演示。 生成默認 Chaco Stacked Bar 的代碼 Plot

"""
Simple example of a stacked bar chart
"""

# Major library imports
import numpy

# Enthought library imports
from enable.api import ComponentEditor
from traits.api import HasTraits, Instance
from traitsui.api import UItem, View

# Chaco imports
from chaco.api import LabelAxis, Plot, ArrayPlotData, ArrayDataSource


class PlotExample(HasTraits):

    plot = Instance(Plot)

    def _plot_default(self):
        index = numpy.array([1, 2, 3, 4, 5])
        series_a, series_b, series_c = (index * 10, index * 5, index * 2)
        # Stack them up
        series_c = series_c + series_b + series_a
        series_b = series_b + series_a

        plot_data = ArrayPlotData(index=index)
        plot_data.set_data("series_a", series_a)
        plot_data.set_data("series_b", series_b)
        plot_data.set_data("series_c", series_c)
        plot = Plot(plot_data)
        plot.plot(("index", "series_a"), type="bar", bar_width=0.8, color="auto")
        plot.plot(
            ("index", "series_b"),
            type="bar",
            bar_width=0.8,
            color="auto",
            starting_value=ArrayDataSource(series_a),
        )
        plot.plot(
            ("index", "series_c"),
            type="bar",
            bar_width=0.8,
            color="auto",
            starting_value=ArrayDataSource(series_b),
        )

        # set the plot's value range to 0, otherwise it may pad too much
        plot.value_range.low = 0

        # replace the index values with some nicer labels
        label_axis = LabelAxis(
            plot,
            orientation="bottom",
            title="Months",
            positions=list(range(1, 10)),
            labels=["jan", "feb", "march", "april", "may"],
            small_haxis_style=True,
        )

        plot.underlays.remove(plot.index_axis)
        plot.index_axis = label_axis
        plot.underlays.append(label_axis)

        return plot

    traits_view = View(
        UItem("plot", editor=ComponentEditor()), width=400, height=400, resizable=True,
    )


demo = PlotExample()

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

我將通過為堆疊條形圖中的每個段制作一個單獨的條形 plot 渲染器來解決這個問題。 像這樣的東西應該可以解決問題(對於非常冗長for語句感到抱歉):

"""
Simple example of a stacked bar chart
"""

# Major library imports
import numpy

# Enthought library imports
from enable.api import ComponentEditor
from traits.api import HasTraits, Instance
from traitsui.api import UItem, View

# Chaco imports
from chaco.api import LabelAxis, Plot, ArrayPlotData, ArrayDataSource


class PlotExample(HasTraits):

    plot = Instance(Plot)

    def _plot_default(self):
        index = numpy.array([1, 2, 3, 4, 5])
        series_a, series_b, series_c = (index * 10, index * 5, index * 2)
        # Stack them up
        series_c = series_c + series_b + series_a
        series_b = series_b + series_a

        plot_data = ArrayPlotData()
        for i, (index_val, series_a_val, series_b_val, series_c_val) in enumerate(zip(
            index, series_a, series_b, series_c
        )):
            plot_data.set_data(f"index_{i}", [index_val])
            plot_data.set_data(f"series_a_{i}", [series_a_val])
            plot_data.set_data(f"series_b_{i}", [series_b_val])
            plot_data.set_data(f"series_c_{i}", [series_c_val])

        plot = Plot(plot_data)

        for i, (index_val, series_a_val, series_b_val, series_c_val) in enumerate(zip(
            index, series_a, series_b, series_c
        )):
            plot.plot(
                (f"index_{i}", f"series_a_{i}"),
                type="bar",
                bar_width=0.8,
                color="auto",
            )
            plot.plot(
                (f"index_{i}", f"series_b_{i}"),
                type="bar",
                bar_width=0.8,
                color="auto",
                starting_value=ArrayDataSource([series_a_val]),
            )
            plot.plot(
                (f"index_{i}", f"series_c_{i}"),
                type="bar",
                bar_width=0.8,
                color="auto",
                starting_value=ArrayDataSource([series_b_val]),
            )

        # set the plot's value range to 0, otherwise it may pad too much
        plot.value_range.low = 0

        # replace the index values with some nicer labels
        label_axis = LabelAxis(
            plot,
            orientation="bottom",
            title="Months",
            positions=list(range(1, 10)),
            labels=["jan", "feb", "march", "april", "may"],
            small_haxis_style=True,
        )

        plot.underlays.remove(plot.index_axis)
        plot.index_axis = label_axis
        plot.underlays.append(label_axis)

        return plot

    traits_view = View(
        UItem("plot", editor=ComponentEditor()), width=400, height=400, resizable=True,
    )


demo = PlotExample()

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

截圖 每個條形段具有不同顏色的堆疊條形圖的簡單示例

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM