Цвет определяет область фона графика в зависимости от состояния - PullRequest
3 голосов
/ 10 июля 2010

У меня есть гистограмма (2D), и я хочу сделать фон красным для частей, где другой вектор имеет значение> 1, т.е.

пример:

график = [2 3 5 4 9 1 7] цвет = [0 2 2 1 0 1 2]

, поэтому на графике будут отображаться обычные столбики, а задний фон (включая расстояние между столбцами) будет окрашен в красный цвет за столбцами «3», «5» и «7» (позиция 2,3,7)

пример с синим цветом: синий график bg http://img9.imageshack.us/img9/1478/barkc.jpg

Это как-то возможно?

Спасибо

Ответы [ 2 ]

4 голосов
/ 10 июля 2010

Да, это возможно

%# define some parameters
backgroundColor = 'r';
backgroundWidth = 0.9;
foregroundWidth = 0.3;

%# collect the data
graph = [2 3 5 4 9 1 7];
color = [0 2 2 1 0 1 2];

x = 0:length(graph)-1;
colIdx = color>1;
bgBarHeight = max(graph)+1; %# background bars are 1 taller than max

%# first, plot red bars - I plot them as background as in your question, 
%# not as transparent overlay as in your example (see yuk's answer for that)
bar(x,colIdx*bgBarHeight,backgroundWidth,'FaceColor',backgroundColor,'EdgeColor','none')

%# use hold on to prevent background from disappearing
hold on

%# then, plot foreground bars. Use hold on so that the background isn't lost
bar(x,graph,foregroundWidth,'FaceColor','k')

%# label the axes
xlabel('X Axis')
ylabel('Y Axis')
3 голосов
/ 10 июля 2010

Немного изменен код Jonas, чтобы сделать фоновые полосы прозрачными и исправить некоторые ошибки:

%# define some parameters
foregroundColor = 'k';
backgroundColor = 'r';
foregroundWidth = 0.3;
backgroundWidth = 0.9;

%# collect the data
graph = [2 3 5 4 9 1 7];
color = [0 2 2 1 0 1 2];

x = 0:length(graph)-1;
colIdx = color>1;
bgBarHeight = max(graph)+1; %# background bars are 1 taller than max

%# first, plot foreground bars
b1 = bar(x,graph,foregroundWidth,'FaceColor',foregroundColor);
hold on
%# then, plot background bars. 
%# they will overlap foreground bars, but we'll make them transparent later
b2 = bar(x,colIdx*bgBarHeight,backgroundWidth,'FaceColor',backgroundColor,'EdgeColor','none');
hold off

%# make background bars transparent
pch = get(b2,'child'); %# get patch objects from barseries object
set(pch,'FaceAlpha',0.3); %# set transparency

xlabel('X Axis')
ylabel('Y Axis')
...