Labfans是一个针对大学生、工程师和科研工作者的技术社区。 论坛首页 | 联系我们(Contact Us)
MATLAB爱好者论坛-LabFans.com
返回   MATLAB爱好者论坛-LabFans.com > 其它 > 资料存档
资料存档 资料存档
回复
 
主题工具 显示模式
旧 2019-12-10, 20:30   #1
poster
高级会员
 
注册日期: 2019-11-21
帖子: 3,006
声望力: 66
poster 正向着好的方向发展
帖子 在MATLAB中更改seqlogo图形的x轴

我正在以编程方式制作大量的seqlogos 。它们有数百列宽,因此运行seqlogo通常会创建太薄而看不到的字母。我注意到,我只关心其中的几列(不一定是连续的列)……大多数是噪音,但有些高度保守。

我使用如下代码片段:

wide_seqs = cell2mat(arrayfun(@randseq, repmat(200, [500 1]), 'uniformoutput', false)); wide_seqs(:, [17,30, 55,70,130]) = repmat(['ATCGG'], [500 1]) conserve_cell = seqlogo(wide_seqs, 'displaylogo', false); high_bit_cols = any(conserve_cell{2}>1.0,1); [~, handle] = seqlogo(wide_seqs(:,high_bit_cols )); 尽管我这样做时会丢失有关数据来自哪些列的信息。

通常,我只需要更改seqlogo的x轴seqlogo 。但是, seqlogo是某种基于Java的疯狂对象,其调用类似于:

set(handle, 'xticklabel', num2str(find(high_bit_cols))) 不工作任何帮助将不胜感激。

谢谢,威尔

编辑:

赏金大方,我愿意接受各种疯狂的方法来更改轴标签,包括(但不限于):保存后使用图像处理工具箱修改图像,使用文本框创建新的seqlogo函数,修改Java代码(如果可能)等。我不愿意接受“使用python”,“使用此R库”或任何其他非Matlab解决方案。



回答:

好的,我为此问题花了几个小时。看来您无法在该hgjavacomponent对象的顶部放置任何MATLAB对象(轴或文本框)。当然,我无法修改Java代码。因此,我找到的唯一可行的解决方案是从头开始创建图形。

我不想重写代码来计算权重矩阵(符号高度),您已经做到了。但是,如果您根本不想使用MATLAB的seqlogo,则可以这样做。因此,我对您的最后一行进行了一些更改以获取矩阵:

[wm, handle] = seqlogo(wide_seqs(:,high_bit_cols )); 文本符号的问题是您无法精确控制其大小,无法将符号适合文本框。这可能就是MATLAB决定使用Java图形对象的原因。但是我们可以创建符号图像并对其进行处理。

这是创建字母图像的代码:

letters = wm{1}; clr = [0 1 0; 0 0 1; 1 0.8 0;1 0 0]; % corresponding colors for t = 1:numel(letters) hf = figure('position',[200 200 100 110],'color','w'); ha = axes('parent',hf, 'visible','off','position',[0 0 1 1]); ht = text(50,55,letters(t),'color',clr(t,:),'units','pixels',... 'fontsize',100,'fontweight','norm',... 'vertical','mid','horizontal','center'); F = getframe(hf); % rasterize the letter img = F.cdata; m = any(img < 255,3); % convert to binary image m(any(m,2),any(m,1))=1; % mask to cut white borders imwrite(reshape(img(repmat(m,[1 1 3])),[sum(any(m,2)) sum(any(m,1)) 3]),... [letters(t) '.png']) close(hf) end 然后,我们使用这些图像绘制新的seqlogo图:

xlabels = cellstr(num2str(find(high_bit_cols)')); letters = wm{1}; wmat=wm{2}; % weight matrix from seqlogo [nletters npos] = size(wmat); wmat(wmat
poster 当前离线   回复时引用此帖
回复


发帖规则
不可以发表新主题
不可以发表回复
不可以上传附件
不可以编辑自己的帖子

启用 BB 代码
论坛禁用 表情符号
论坛启用 [IMG] 代码
论坛启用 HTML 代码



所有时间均为北京时间。现在的时间是 02:38


Powered by vBulletin
版权所有 ©2000 - 2025,Jelsoft Enterprises Ltd.