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

Может потребоваться изменить цвет всех узлов, представляющих ветви. Зная, что первые «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)

Экстент (размер) узлов оценивается автоматически с помощью свойств узла «StartSize» и «Label». Чтобы узлы имели любой размер, отключите свойство BIOGRAPH «NireAutoSize» и обновите макет.
bgInViewer.NodeAutoSize = 'off'; set(branchHandlers,'Size',[20 20]) dolayout(bgInViewer)

Чтобы удалить метки из узла ветви, необходимо вручную скопировать текстовые строки из свойства «ID» в свойство «Label». dolayout автоматически устанавливает значение «» ID «» для свойства «» SunTextInNodes «», если для всех узлов свойство «» 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','-'))
