我想要一个算法,在条形图前面组织一个二维的点云,这样观众就可以很容易地看到数据的传播。点的y位置需要与数据的值相等/缩放/成正比,但x位置并不重要,将由算法决定。我认为一个好的策略是尽量减少各点之间的重叠,并将点集中起来。
下面是这样一个没有组织要点的阴谋的例子:
我用MATLAB生成前面有点的条形图,但我只对选择点的x位置值的最佳方法感兴趣。
之后,我在中手工组织了这些要点,这很费时.有什么建议吗?这是一个已经解决的问题的子问题吗?这种情节叫什么?
对于高样本量,我想像下面这样的东西会比点云更好。
我认为,从数学上讲,从y-值的数组开始,它将最大化每个元素与其他元素之间的差值之和,通过重新排列数组中元素的顺序,按元素之间的距离进行反向缩放。
下面是我用来生成图形的MATLAB代码:
y = zeros(20,6);
yMean = zeros(1,6);
for i=1:6
y(:,i) = 5 + (8-5).*rand(20,1);
yMean(i) = mean(y(:,i));
end
figure
hold on
bar(yMean,0.5)
for i=1:6
x = linspace(i-0.3,i+0.3,20);
plot(x,y(:,i),'ro')
end
axis([0,7,0,10])
发布于 2017-06-21 06:38:21
这里有一种方法可以根据分组到(直方图)箱来确定x位置.结果类似于https://stackoverflow.com/a/1934882/4720018中的绘图,但保留了原始的y-值。为了方便起见,对点进行排序,但可以使用bin_index
按外观顺序显示它们。这是否是选择x坐标的“最佳方式”取决于您试图实现什么。
% Create some dummy data
dummy_data_y = 1+0.1*randn(10,3);
% Create bar plot (assuming you are interested in the mean)
bar_obj = bar(mean(dummy_data_y));
% Obtain data size info
n = size(dummy_data_y, 2);
% Algorithm that creates an x vector for each data column
sorted_data_y = sort(dummy_data_y, 'ascend'); % for convenience
number_of_bins = 5;
for j=1:n
% Get histogram information
[bin_count, ~, bin_index] = histcounts(sorted_data_y(:, j), number_of_bins);
% Create x-location data for current column
xj = [];
for k = 1:number_of_bins
xj = [xj 0:bin_count(k)-1];
end
% Collect x locations per column, scale and translate
sorted_data_x(:, j) = j + (xj-(bin_count(bin_index)-1)/2)'/...
max(bin_count)*bar_obj.BarWidth;
end
% Plot the individual data points
line(sorted_data_x, sorted_data_y, 'linestyle', 'none', 'marker', '.', 'color', 'r')
这是否是显示数据的好方法仍有待讨论。
https://stackoverflow.com/questions/44663702
复制相似问题