Extracting data from histogram plots
显示 更早的评论
Hello. I'm trying to process some data from some chemical analyses I did a while ago. I have 3 types of data: particle diameter, nitrogen content (%), and sulfur content (%). I've already managed to organize the particle diameter data into a histogram plot with something like 50 bins. Now, I'd like to figure out the average nitrogen and sulfur content of the particles in each bin. I'm not sure how to do this, though, and I haven't found any obvious tutorials to explain how to do this. Any advice?
采纳的回答
3 methods to group data and compute mean for each group
Each method deals with empty bins differently.
discretize + splitapply
Use discretize to group each value into the bins used in histogram and then splitapply to compute the mean for each group. Note that each bin must contain at least one data point.
Example: compute the mean of data in bins defined by edges.
rng default % for reproducibility of this demo
data = rand(1,100)*100;
edges = 0:10:100;
binID = discretize(data,edges)
binID = 1×100
9 10 2 10 7 1 3 6 10 10 2 10 10 5 9 2 5 10 8 10 7 1 9 10 7 8 8 4 7 2
a = splitapply(@mean,data,binID)
a = 1×10
5.3838 15.2780 26.0259 35.6310 46.5284 55.4195 66.1338 75.5438 83.3041 94.1885
discretize + groupsummary
Use discretize to group each value into the bins and then groupsummary to compute the mean of each group. When working with vectors, the first two arguments must be column vectors.
Note that the output vector skips empty bins. See additional outputs to groupsummary to identify which bins are represented in the first output.
s = groupsummary(data(:),binID(:),'mean')
s = 10×1
5.3838
15.2780
26.0259
35.6310
46.5284
55.4195
66.1338
75.5438
83.3041
94.1885
discretize + accumarray
Use discretize to group each value into the bins and then accumarray to compute the mean of all bins.
Note that empty bins are represented by a 0.
m = accumarray(binID(:),data,[],@mean)
m = 10×1
5.3838
15.2780
26.0259
35.6310
46.5284
55.4195
66.1338
75.5438
83.3041
94.1885
Comparison of these methods when some bins are empty
data = randn(100,1)+10; % expected range: ~6 : ~13
edges = 0:3:15; % 5 bins but the first two will be empty
binID = discretize(data, edges);
m = accumarray(binID,data,[],@mean)
m = 5×1
0
0
8.4699
10.1766
12.7170
s = groupsummary(data,binID(:),'mean')
s = 3×1
8.4699
10.1766
12.7170
a = splitapply(@mean,data,binID)
Error using splitapply
For N groups, every integer between 1 and N must occur at least once in the vector of group numbers.
For N groups, every integer between 1 and N must occur at least once in the vector of group numbers.
7 个评论
Is there any way to discretize based on a lograrithmic scale? My data is organized so that the smallest bins have the smallest size (e.g., bin 1 ranges from 0.1 to 0.175 microns) and the largest bins have the largest size (e.g., bin 60 ranges from 7.499 to 8.058 microns). Each bin size is different and increases in size from the smallest to the largest bin.
Yes, the second input argument for discretize is a vector of bin edges which you can define any way you'd like. If you're happy with your histogram bin edges, you can use the same edges to discretize your data.
If you had read the documentation of "discretize", you would know that the parameter "edges" is exactly what you are asking for.
I already read the discretize documentation. I just missed the edges parameter. No need to be a dick about it.
Thank you, Adam. That's helpful advice. I think I've got what I need now. I appreciate the guidance.
Hi again. I've run into another issue. When trying to use splitapply I get the following error
"Group numbers must be a vector of positive integers, and cannot be a sparse vector."
My understanding is that because I have values in my column that are zero, splitapply cannot be used. Some of the particles I'm looking at don't have nitrogen or sulfur, but I still have to average a group such as 0 0 0 5.0 2.5. Any way to get around this?
Let's keep it civil here.
As you mentioned, if one of the bins have no values, then splitapply won't work.
I'll add alternatives to my answer.
更多回答(0 个)
类别
在 帮助中心 和 File Exchange 中查找有关 Data Distribution Plots 的更多信息
另请参阅
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!选择网站
选择网站以获取翻译的可用内容,以及查看当地活动和优惠。根据您的位置,我们建议您选择:。
您也可以从以下列表中选择网站:
如何获得最佳网站性能
选择中国网站(中文或英文)以获得最佳网站性能。其他 MathWorks 国家/地区网站并未针对您所在位置的访问进行优化。
美洲
- América Latina (Español)
- Canada (English)
- United States (English)
欧洲
- Belgium (English)
- Denmark (English)
- Deutschland (Deutsch)
- España (Español)
- Finland (English)
- France (Français)
- Ireland (English)
- Italia (Italiano)
- Luxembourg (English)
- Netherlands (English)
- Norway (English)
- Österreich (Deutsch)
- Portugal (English)
- Sweden (English)
- Switzerland
- United Kingdom (English)
