我想要一种算法来在条形图前面组织2D云点,以便观众可以轻松地看到数据的传播。该点的y位置需要与数据的值相等/缩放/成比例,但x位置并不重要,并且将由算法确定。我认为一个好的策略是尽量减少各点之间的重叠并使点居中。
这是一个没有组织点的情节的例子:
我使用MATLAB生成带有前面点的条形图,但我对选择点的x位置值的最佳方法感兴趣。
之后我一直在 Adobe Illustrator 中手工组织积分,这非常耗时。有什么建议?这是一个已经解决的问题的子问题吗?这种情节叫做什么?
对于高样本量,我想像下面的东西比点云更好。
我认为,在数学上,从一些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])
答案 0 :(得分:0)
这是一种基于分组到(直方图)区间来确定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')
这是否是展示数据的好方法仍有待讨论。