【问题标题】:Automatically choose x locations of scatter plot in front of bar graph在条形图前面自动选择散点图的 x 位置
【发布时间】:2023-04-06 15:15:01
【问题描述】:

我想要一种算法来组织条形图前面的二维点云,以便查看者可以轻松看到数据的分布。点的 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])

【问题讨论】:

  • errorbar 这样的东西是我通常期望看到的一种表示数据方差(或“传播”)的方式,它可以是added to bar charts。跨度>

标签: algorithm matlab bar-chart visualization matlab-figure


【解决方案1】:

这是一种基于分组(直方图)箱确定 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')  

这是否是显示数据的好方法仍有待讨论。

【讨论】:

  • 这是我示例代码的更好替代品,但并不能真正回答我试图提出的问题。
  • 抱歉,我好像误解了你的问题。也许您可以通过向我们展示您手动组织的情节来澄清?您是否需要清晰区分每个数据点?会不会是 this 之类的东西(旋转 90 度并应用于每个条形图)?
  • 根据上述更新了答案。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2023-03-15
  • 1970-01-01
  • 2019-07-02
  • 1970-01-01
  • 1970-01-01
  • 2021-12-18
  • 1970-01-01
相关资源
最近更新 更多