Построение многоцветной линии в Matlab

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

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

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

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

ИЗМЕНИТЬ Спасибо за ответ. Думаю, я действительно должен дать дополнительную информацию.

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

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

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

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

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

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

Ответы

Ответ 1

Вы можете использовать код, который у вас есть, и просто конкатенировать дескрипторы из каждой строки в вектор ручек. Если вы хотите изменить свойства обеих строк одновременно, функция 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



ОБНОВЛЕНИЕ:. Поскольку вы упоминаете, что используете draggable из 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 для обеих строк, используя указанную выше функцию как вызываемую при перемещении любого объекта:

    draggable(h1,@motionFcn);
    draggable(h2,@motionFcn);
    

Ответ 2

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

Ответ 3

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

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

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