Построение разноцветной линии в Matlab - PullRequest
14 голосов
/ 15 марта 2010

Я хотел бы построить вертикальную линию (я бы предпочел любую ориентацию, но сейчас я был бы рад только вертикальной) с двухцветными штрихами, скажем, красный-синий-красный-синий -...

Я знаю, что мог бы сделать это так:

plot([1,1],[0,1],'r'),
hold on,
plot([1,1],[0,1],'--b')

Однако, поскольку мне нужно иметь возможность перемещать линию, среди прочего она должна иметь только одну ручку. Как я мог это сделать?

EDIT Спасибо за ответ. Полагаю, мне действительно стоит дать больше информации.

У меня есть некоторые данные, которые подразделяются на разные части. Я хочу иметь возможность вручную корректировать границы между классами. Для этого я рисую вертикальные линии на границах классификации и использую draggable , чтобы разрешить перемещение линий.

Для границы между красным и синим классом я хотел бы иметь красно-синюю линию.

plot(ones(10,1),linspace(0,1,10),'-bs','MarkerFaceColor','r','MarkerEdgeColor','none','linewidth',6)

- это то, что я сейчас использую. Тем не менее, это не так красиво (если я хочу равный интервал, это становится настоящей болью, и я хочу дать обоим цветам одинаковый вес), и я хотел бы иметь возможность использовать три цвета (а не с краем маркера и лицо другое, потому что мои глаза кровоточат).

К сожалению, draggable не позволяет мне использовать несколько дескрипторов, а группировка строк с помощью hggroup, похоже, не создает перетаскиваемый объект.

cline выглядит многообещающим подходом, но цвета радуги не подойдут для моего приложения.

Ответы [ 3 ]

6 голосов
/ 15 марта 2010

Вы можете использовать код, который у вас есть, и просто объединить маркеры из каждой строки в вектор маркеров. Если вы хотите изменить свойства обеих строк одновременно, функция SET может принять вектор дескрипторов в качестве аргумента. Из документации на SET :

set(H,'PropertyName',PropertyValue,...) устанавливает именованные свойства в указанные значения на объект (ы) идентифицируется H. H может быть вектором ручки, в этом случае set устанавливает значения свойств для всех объекты.

Вот пример:

h1 = plot([1 1],[0 1],'r');    %# Plot line 1
hold on;
h2 = plot([1 1],[0 1],'--b');  %# Plot line 2
hVector = [h1 h2];             %# Vector of handles
set(hVector,'XData',[2 3]);    %# Shifts the x data points for both lines



ОБНОВЛЕНИЕ: Поскольку вы упоминаете, что используете перетаскиваемый из MathWorks File Exchange , вот альтернативное решение. Из описания draggable :

Функция, которая вызывается, когда объект перемещается может быть предоставлен как необязательный аргумент, так что движение вызывает дальнейшие действия.

Затем вы можете попробовать следующее решение:

  • Постройте две строки, сохранив дескриптор для каждой (т. Е. h1 и h2).
  • Поместите дескриптор для каждого в 'UserData' свойство другого:

    set(h1,'UserData',h2);
    set(h2,'UserData',h1);
    
  • Создайте следующую функцию:

    function motionFcn(hMoving)  %# Currently moving handle is passed in
      hOther = get(hMoving,'UserData');  %# Get the other plot handle
      set(hOther,'XData',get(hMoving,'XData'),...  %# Update the x data
                 'YData',get(hMoving,'YData'));    %# Update the y data
    end
    
  • Включите перетаскиваемый для обеих линий, используя вышеуказанную функцию в качестве функции, вызываемой при перемещении любого объекта:

    draggable(h1,@motionFcn);
    draggable(h2,@motionFcn);
    
3 голосов
/ 15 марта 2010

Я никогда не использовал его, но есть сообщение Себастьяна Хёльца под названием CLINE на Mathworks File Exchange, которое кажется связанным.

1 голос
/ 15 марта 2010

Я не знаю, как сделать именно то, что вы хотите, но, вероятно, причина, по которой вы хотите это сделать, состоит в том, чтобы каким-то образом отличить эту линию от других линий. В том же духе взгляните на документацию MathWorks по двухмерным линиям . В частности, этот пример:

plot(x,y,'--rs','LineWidth',2,...
                'MarkerEdgeColor','k',...
                'MarkerFaceColor','g',...
                'MarkerSize',10)

должно дать вам множество идей для вариаций. Если вам действительно нужны двухцветные штрихи, это может помочь определить, почему. Таким образом, даже если мы не сможем ответить на вопрос, возможно, мы сможем убедить вас, что вам не нужны двухцветные штрихи. Поскольку вы уже исключили перекрывающееся решение, я вполне уверен, что не существует решения, отвечающего всем вашим потребностям. Я предполагаю, что двухцветность - самая изменчивая из этих потребностей.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...