【问题标题】:Binning and plotting (Hist) data from a (n,2) matrix对 (n,2) 矩阵中的 (Hist) 数据进行分箱和绘图
【发布时间】:2015-01-07 00:51:09
【问题描述】:

我(大部分)有一个原型脚本来实现我想要的,但我还不是程序员,我写的很麻烦。我可以使用一些帮助将它安装到一个可以容纳超过 10 个垃圾箱的包装中(见下文)。在此过程中,我也很想知道如何为每个系列分配不同的颜色。

简而言之,我有一个 (n,2) 矩阵——其中 n 是 20,000 到 40,000),它由两个变量的数据组成。通常,我会在轴上绘制每个变量的散点图(或密度图)。现在,我想沿 x 轴对数据进行切片(错误,将数据分成 bin),并为每个 bin 中的 y 值绘制直方图。然后,我将每个 bin 的所有直方图绘制在同一个图上(最好使用不同的颜色),以更清楚地了解分布如何随着 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));

建议?谢谢!

【问题讨论】:

  • @LordHenryWotton 和 dave kielpinski 建议的 For 循环正是我所需要的。颜色必须等待,因为您的答案表明要修改颜色,该选项必须包含在绘图功能中。 logicleHist 是一个可容纳负数据的双指数“轨迹”图,我必须调整函数以包含颜色修饰符。与此同时,一个子情节会做得很好。你们太棒了。

标签: matlab plot histogram bin


【解决方案1】:

如果我对您的问题的理解正确,您希望将对应于 10 个 x 箱(或 data(:,1))的 y(或 data(:,2))直方图。请参阅下面的代码,并参考注释代码和 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,:));

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

【讨论】:

  • 我看不出将dp_bounds=logspace(1,5,dp_bins); 变成linspace(min(x(:,1)), max(x(:,1)),bins) 的原因,因为用户清楚地知道他想要dp_bins=10 垃圾箱(而不是5 个垃圾箱),而且他不希望它们相同(线性)间隔,但对数间隔。
  • @Nras,感谢您的注意,事实上我首先弄错了,但我想我现在知道 OP 想要什么,我重写了解决方案。
【解决方案2】:

第一步可能是使用 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 控制直方图颜色也很困难。我建议对每个bs 使用茎图,而不是直方图。这将需要对每个 b 进行另一个手动分箱步骤,您可以使用嵌套的 for 循环来完成。

【讨论】:

  • 完美运行。我正在使用的logicleHist 函数是一个平滑的轨迹,因此它可以很容易地以不同的颜色显示,但我了解到它需要一些调整才能添加颜色修饰符。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-12-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多