[英]Chaco stacked bar plot with different colour for each bar and segment
我試圖在 Chaco 堆疊條 plot 中控制每個條和每個條段的顏色。
例如,運行 Chaco 的堆疊條 plot 示例給出,
我怎么把它變成這個怪物?
我可以看到 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.