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

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

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

The 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);

Вызовите конструктор объектов 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 с важной информацией (матрица соединений и идентификаторы узла) можно изменить его свойства. Например, измените тип размещения на 'radial', что лучше всего для филогенетических данных и шкалы.

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 в окне средства просмотра. The 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'. Можно заставить узлы иметь любой размер, отключив свойство BIOGRAPH 'NodeAutoSize', а затем обновив размещение.

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 (пример в директории biodemos) для отображения атомарного состава каждого белка в виде круговой диаграммы. Используйте эту функцию в качестве шаблона для создания собственных настроенных узлов.

Получите последовательности текущих белков человека, с которыми вы работаете, и поместите последовательности в свойство «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','-'))