从 (n,2) 矩阵中合并和绘制 (Hist) 数据

Binning and plotting (Hist) data from a (n,2) matrix

我(大部分)有一个原型脚本来实现我想要的,但我(还)不是程序员,而且我写的很繁琐。我可以使用一些帮助将它装入一个可以容纳 10 个以上垃圾箱的包裹中(见下文)。当我们这样做的时候,我也很想知道如何为每个系列分配不同的颜色。

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

注意:1) 数据是按对数比例设置的,因此是对数空间箱。 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));

有什么建议吗?谢谢!

如果我对你的问题理解正确,你想要直方图 y's(或 data(:,2))对应于 x 的 10 个 bin(或 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 提示符中,您应该会看到类似于下图的内容。

更新:以上代码是在Matlab 2010上测试的,如果使用2014版本,可能需要更换:

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

with histogram(sel_data,'FaceColor', bar_color(ii,:))(注意缺少 semi-colon),如在另一个解决方案中观察到的那样。

第一步可能是使用 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 循环来完成。