从 (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
依次扮演您的 b1
、b2
、...的角色。注意 histogram
是最新版本的 Matlab 中当前使用的函数。我只有hist
自己
请注意,您可以在单个语句中将第二个索引分配给 b
。我通常会写
b = data(data(:,1)>=dp_bounds(i) & data(:,2)<=dp_bounds(i+1),2)
histogram(b)
如果你想叠加这么多直方图,我认为无论你用什么颜色,情节都会变得很难看。用 hist
控制直方图颜色也相当困难。我建议对每个 b
使用柱状图,而不是直方图。这将需要对每个 b
进行另一个手动装箱步骤,您可以使用嵌套的 for
循环来完成。
我(大部分)有一个原型脚本来实现我想要的,但我(还)不是程序员,而且我写的很繁琐。我可以使用一些帮助将它装入一个可以容纳 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
依次扮演您的 b1
、b2
、...的角色。注意 histogram
是最新版本的 Matlab 中当前使用的函数。我只有hist
自己
请注意,您可以在单个语句中将第二个索引分配给 b
。我通常会写
b = data(data(:,1)>=dp_bounds(i) & data(:,2)<=dp_bounds(i+1),2)
histogram(b)
如果你想叠加这么多直方图,我认为无论你用什么颜色,情节都会变得很难看。用 hist
控制直方图颜色也相当困难。我建议对每个 b
使用柱状图,而不是直方图。这将需要对每个 b
进行另一个手动装箱步骤,您可以使用嵌套的 for
循环来完成。