从(n,2)矩阵中分箱和绘图(Hist)数据

时间:2015-01-07 00:51:10

标签: matlab plot histogram bin

我(大部分)都有一个原型脚本来实现我想要的东西,但我不是程序员(还),我写的东西非常麻烦。我可以使用一些帮助将其装入一个可以容纳超过10个箱子的包装(见下文)。虽然我们正在努力,但我也很想知道如何为每个系列分配不同的颜色。

简而言之,我有一个(n,2)矩阵 - 其中n是20,000到40,000),它由两个变量的数据组成。通常,我使用轴上的每个变量制作散点图(或密度图)。现在,我想沿x轴切割数据(错误,将数据划分为箱),并绘制每个箱中y值的直方图。然后,我绘制同一图表中每个箱子的所有直方图(最好是不同的颜色),以便更清楚地看到当X变化时分布如何变化。

注意:1)数据是在对数刻度上设置的,因此是logspace bin。 2)为了论证,假装logicleHist只是一个常规的hist函数。

实施例



%DensPlot Slicer
data=[BFP GFP];
dp_bins=10;
dp_bounds=logspace(1,5,dp_bins);

%bins
b1=data(data(:,1) >= dp_bounds(1) & data(:,1) < dp_bounds(2),:);
b2=data(data(:,1) >= dp_bounds(2) & data(:,1) < dp_bounds(3),:);
b3=data(data(:,1) >= dp_bounds(3) & data(:,1) < dp_bounds(4),:);
b4=data(data(:,1) >= dp_bounds(4) & data(:,1) < dp_bounds(5),:);
b5=data(data(:,1) >= dp_bounds(5) & data(:,1) < dp_bounds(6),:);
b6=data(data(:,1) >= dp_bounds(6) & data(:,1) < dp_bounds(7),:);
b7=data(data(:,1) >= dp_bounds(7) & data(:,1) < dp_bounds(8),:);
b8=data(data(:,1) >= dp_bounds(8) & data(:,1) < dp_bounds(9),:);
b9=data(data(:,1) >= dp_bounds(9) & data(:,1) < dp_bounds(10),:);

figure;
hold on
logicleHist(b1(:,2));
logicleHist(b2(:,2));
logicleHist(b3(:,2));
logicleHist(b4(:,2));
logicleHist(b5(:,2));
logicleHist(b6(:,2));
logicleHist(b7(:,2));
logicleHist(b8(:,2));
logicleHist(b9(:,2));
&#13;
&#13;
&#13;

连连呢?谢谢!

2 个答案:

答案 0 :(得分:1)

如果我理解你的问题,你想要直方图y(或data(:,2))对应10个x(或data(:,1))。请参阅下面的代码并参考注释代码和SO以获取有关代码的进一步说明。

% The following are custom-created to make the code self-contained, replace with 
% your data and bounds.
data(:,1)=rand(100,1);
data(:,2)=rand(100,1);
dp_bounds=logspace(min(data(:,1)),max(data(:,1)),10);
data(:,1)=10.^rand(100,1);

figure('Position',[10 10 800 750],'Color','w');
bar_color=colormap;
bar_color=bar_color(linspace(1,size(colormap,1),numel(dp_bounds)),:); % Select colors per bar
for ii=1:numel(dp_bounds)-1
    sel_data=data(data(:,1) >= dp_bounds(ii) & data(:,1) < dp_bounds(ii+1),2);
    subplot(numel(dp_bounds)-1,1,ii);
    [h,bins_y]=hist(sel_data);
    bar(bins_y,h,'FaceColor', bar_color(ii,:)); % Bar plot with y histograms (auto bins for y)
    title(['x from ',num2str(dp_bounds(ii)),' to ',num2str(dp_bounds(ii+1))],'FontSize', 12)
end

如果将上面的代码复制并粘贴到Matlab提示符下,您应该会看到类似于下图的内容。 enter image description here

更新:上面的代码在Matlab 2010上进行了测试。如果使用2014版本,则可能需要替换:

[h,bins_y]=hist(sel_data);
bar(bins_y,h,'FaceColor', bar_color(ii,:));

与另一个解决方案中观察到histogram(sel_data,'FaceColor', bar_color(ii,:))(注意缺少分号)。

答案 1 :(得分:1)

第一步可能是使用for循环。

之后替换代码中的所有内容
%bins

figure
hold on
for i = 1:(dp_bins-1)
     b = data(data(:,1)>=dp_bounds(i) & data(:,2)<=dp_bounds(i+1),:)
     hist(b(:,2))
end

其中b依次扮演您b1b2,...的角色。注意histogram是最新版Matlab中当前使用的函数。我自己只有hist

请注意,您可以在单个语句中将第二个索引分配给b。我通常会写

b = data(data(:,1)>=dp_bounds(i) & data(:,2)<=dp_bounds(i+1),2)
histogram(b)

如果你想要覆盖这么多的直方图,我认为无论你如何处理颜色,情节都会变得非常难以阅读。用hist控制直方图颜色也很困难。我建议对每个b使用干线图而不是直方图。这需要在每个b上执行另一个手动分箱步骤,您可以使用嵌套的for循环来完成此操作。