Визуально представляющие взаимосвязанные данные

Этот пример показывает, как использовать объект BIOGRAPH визуально представлять соединенные данные.

Потребность в представлении взаимосвязанных данных появляется в нескольких приложениях биоинформатики. Например, взаимодействия белка белка, сетевой вывод, трассы реакции, кластерные данные, сети Bayesian и филогенетические деревья могут быть представлены со взаимосвязанными графиками. Объект BIOGRAPH позволяет вам создавать всестороннее и графическое размещение этого типа данных. В этом примере вы изучаете, как заполнить объект BIOGRAPH, представить его, и затем изменить его свойства в порядке настроить его отображение.

Представление Phylogenetic Tree как график

Считайте филогенетическое дерево в объект PHYTREE.

tr = phytreeread('pf00002.tree');

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

sel = getbyname(tr,'human');
tr = prune(tr,~sel(1:33))
    Phylogenetic tree object with 11 leaves (10 branches)

Метод plot для объекта PHYTREE может создать базовый макет филогенетического дерева; однако, элементы графика статичны.

plot(tr)

Информация об объекте PHYTREE может быть помещена в объект BIOGRAPH, таким образом, можно создать динамическое размещение. Во-первых, вытяните некоторую информацию от объекта PHYTREE. Используйте get, чтобы получить свойства объектов PHYTREE и метод getmatrix, чтобы получить матрицу связи.

[names,nn,nb,nl] = get(tr,'NodeNames','NumNodes','NumBranches','NumLeaves');
cm = getmatrix(tr);

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

figure
spy(cm)
colormap(flipud(bone))
title('Top-down direct edges')

Другой подход, чтобы визуализировать эту информацию должен посмотреть на попарные расстояния между всеми узлами (ответвления и листы) в дереве. Используйте метод pdist для объектов PHYTREE найти попарные расстояния.

dm = pdist(tr,'criteria','levels','nodes','all','square',true);
figure
imagesc(dm)
colormap(flipud(bone))
axis image
title('Pairwise distances (levels)')

Филогенетические древовидные наборы данных обеспечивают корень дерева как последний элемент в наборе. При создании матрицы связи BIOGRAPH это помогает инвертировать порядок и данных и имен, так, чтобы график был создан из корня. Это создаст более логическое и визуально привлекательное представление.

cm = flipud(fliplr(cm));
names = flipud(names);

Вызовите конструктора Object BIOGRAPH с матрицей связи и идентификаторами узла. Чтобы исследовать его свойства, можно использовать функцию get.

bg = biograph(cm,names)
get(bg)
Biograph object with 21 nodes and 20 edges.
                   ID: ''
                Label: ''
          Description: ''
           LayoutType: 'hierarchical'
          LayoutScale: 1
                Scale: 1
         NodeAutoSize: 'on'
      ShowTextInNodes: 'label'
             EdgeType: 'curved'
        EdgeTextColor: [0 0 0]
           ShowArrows: 'on'
            ArrowSize: 8
          ShowWeights: 'off'
         EdgeFontSize: 8
        NodeCallbacks: @(node)inspect(node)
        EdgeCallbacks: @(edge)inspect(edge)
    CustomNodeDrawFcn: []
                Nodes: [21x1 biograph.node]
                Edges: [20x1 biograph.edge]

Если объект BIOGRAPH был создан с важной информацией (матрица связи и идентификаторы узла), можно изменить ее свойства. Например, измените тип макета на 'радиальный', который является лучшим для филогенетических данных и шкалы.

bg.LayoutType = 'radial';
bg.LayoutScale = 3/4;
get(bg)
                   ID: ''
                Label: ''
          Description: ''
           LayoutType: 'radial'
          LayoutScale: 0.7500
                Scale: 1
         NodeAutoSize: 'on'
      ShowTextInNodes: 'label'
             EdgeType: 'curved'
        EdgeTextColor: [0 0 0]
           ShowArrows: 'on'
            ArrowSize: 8
          ShowWeights: 'off'
         EdgeFontSize: 8
        NodeCallbacks: @(node)inspect(node)
        EdgeCallbacks: @(edge)inspect(edge)
    CustomNodeDrawFcn: []
                Nodes: [21x1 biograph.node]
                Edges: [20x1 biograph.edge]

Несмотря на то, что узлы и ребра были созданы, объект BIOGRAPH не имеет координат, в которых элементы графика должны быть вовлечены таким образом, что его рендеринг заканчивается в симпатичное и ненарушенное отображение. Прежде, чем представить объект BIOGRAPH, необходимо вычислить соответствующее местоположение для каждого узла. dolayout является методом, который вызывает механизм размещения.

Некоторые свойства объекта BIOGRAPH взаимодействуют с механизмом размещения среди них 'LayoutType', который выбирает алгоритм макета.

dolayout(bg)

Чертите объект BIOGRAPH в окне средства просмотра. Метод view создает Графический интерфейс пользователя (GUI) со взаимосвязанным графиком, возвращающим указатель на глубокую копию объекта BIOGRAPH, который содержится в фигуре. С этим указателем на объект можно позже изменить некоторые свойства рендеринга.

bgInViewer = view(bg)
Biograph object with 21 nodes and 20 edges.

Изменение свойств объектов BIOGRAPH

Вы можете хотеть изменить цвет всех узлов, которые представляют ответвления. Зная, что первые 'nb' узлы являются ответвлениями, можно использовать векторизованную форму set, чтобы изменить свойство 'Color' этих узлов.

nodeHandlers = bgInViewer.Nodes;
branchHandlers = nodeHandlers(1:nb);
leafHandlers = nodeHandlers(nb+1:end);
set(branchHandlers,'Color',[.7 1 .7])
set(leafHandlers,'Color',[1 .7 .7])

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

% First change the 'Shape' of the branches to circles.
set(branchHandlers,'Shape','circle')

Заметьте, что новая форма является эллипсом, и ребра не соединяются приятно с пределами новых форм.

Теперь, запустите механизм размещения по объекту BIOGRAPH, содержавшему в средстве просмотра, чтобы исправить формы и ребра.

dolayout(bgInViewer)

Степень (размер) узлов оценивается автоматически с помощью свойств 'FontSize' и 'Label' узла. Можно обеспечить узлы, чтобы иметь любой размер путем выключения свойства 'NodeAutoSize' BIOGRAPH и затем обновления размещения.

bgInViewer.NodeAutoSize = 'off';
set(branchHandlers,'Size',[20 20])
dolayout(bgInViewer)

Чтобы удалить метки из узла ответвления, мы должны вручную скопировать текстовые строки от свойства 'ID' до свойства 'Label'. dolayout автоматически устанавливает свойство 'ShowTextInNodes' на 'ID', если все узлы имеют свое пустое свойство 'Label'. По умолчанию, когда новый биообъект диаграмм создается, свойства 'Label' пусты.

for i = 1:numel(leafHandlers)
    leafHandlers(i).Label = leafHandlers(i).ID;
end
bgInViewer.ShowTextInNodes = 'label';

Рисование индивидуально настраиваемых узлов

Можно чертить собственные индивидуально настраиваемые узлы в размещении; например, круговые диаграммы или гистограммы могут быть встроены в узлы. В этом примере вы будете использовать функциональный customnodedraw (пример в директории биодемонстраций), чтобы отобразить атомарный состав каждого белка как круговая диаграмма. Используйте эту функцию в качестве шаблона, чтобы создать ваши собственные индивидуально настраиваемые узлы.

Получите последовательности текущих человеческих белков, с которыми вы работаете и помещаете последовательности в свойство "UserData" их соответствующих узлов. Также сохраните вектор соответствующим атомарным составом.

seqs = fastaread('pf00002.fa','ignoregaps',true)
idxs = seqmatch(get(leafHandlers,'ID'),{seqs.Header});
for i = 1:numel(leafHandlers)
    seq = seqs(idxs(i));
    comp = struct2cell(atomiccomp(seq));
    leafHandlers(i).UserData = seq;
    leafHandlers(i).UserData.Distribution = [comp{:}];
end
seqs = 

  32x1 struct array with fields:

    Header
    Sequence

Укажите объект BIOGRAPH на индивидуально настраиваемую функцию, которые чертят узлы. В этом примере customnodedraw изучает свойство 'UserData. Distribution' для данных, используемых в круговой диаграмме.

set(leafHandlers,'Size',[40 40],'shape','circle')
bgInViewer.ShowTextInNodes = 'none';
bgInViewer.CustomNodeDrawFcn = @(node) customnodedraw(node);
bgInViewer.dolayout

Можно присоединить к узлам дополнительную функциональность, таким как открытые ссылки в веб-браузере или выполнить некоторые вычисления, в этом случае мы открываем последовательность аминокислоты с seqviewer

bgInViewer.NodeCallbacks = {@(x) seqviewer(x.UserData)}
Biograph object with 21 nodes and 20 edges.

Поместите пустую последовательность в узлы ответвления, чтобы избежать ошибки, когда функция обратного вызова будет искать поле "Sequence".

set(branchHandlers,'UserData',struct('Sequence','-'))