我以编程方式制作了大量的
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是某种疯狂的基于java的对象,并调用如下:
set(handle,'xticklabel',num2str(find(high_bit_cols)))
不工作.任何帮助将不胜感激.
谢谢,
将
编辑:
在赏金上,我愿意接受任何一种改变轴标签的疯狂方法,包括(但不限于):使用图像处理工具箱在保存后修改图像,使用文本框创建新的seqlogo函数,修改java-code(如果可能的话)等等.我不愿意接受“使用python”,“使用这个R库”或任何其他类型的非Matlab解决方案.
解决方法
好吧,我这个问题杀了几个小时.您似乎无法在该hgjavacomponent对象的顶部放置任何MATLAB对象(轴或文本框).当然,我无法修改java代码.所以我找到的唯一可行解决方案是从头开始创建数字.
我不想重写代码来计算权重矩阵(符号高度),你已经这样做了.但是如果你根本不想使用MATLAB的seqlogo,它就可以完成.所以我已经改变了你的最后一行以获得矩阵:
[wm,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,letters(t),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<0) = 0; % cut negative values % prepare the figure clf hAx = axes('parent',gcf,'on'); set(hAx,'XLim',[0.5 npos+0.5],'XTick',1:npos,'XTickLabel',xlabels) ymax = ceil(max(sum(wmat))); ylim([0 ymax]) axpos = get(hAx,'Position'); step = axpos(3)/npos; % place images of letters for i=1:npos [wms idx] = sort(wmat(:,i)); % largest on the top let_show = letters(idx); ybot = axpos(2); for s=1:nletters if wms(s)==0,continue,end; axes('position',[axpos(1) ybot step wms(s)/ymax*axpos(4)]) ybot = ybot + wms(s)/ymax*axpos(4); img = imread([let_show(s) '.png']); image(img) set(gca,'off') end axpos(1)=axpos(1)+step; end
结果如下:
alt text http://img716.imageshack.us/img716/2073/seqlogoexample.png
当然,代码和数字可以进一步改进,但我希望这是你可以开始使用的东西.如果我错过了什么,请告诉我.