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