2017-06-20 9 views
1

棒グラフの前に2次元の点群を整理して、閲覧者がデータの広がりを容易に見ることができるようにしたいと思います。ポイントのy位置は、データの値と等しい/スケーリング/比例する必要がありますが、xの位置は問題ではなく、アルゴリズムによって決定されます。私は良い戦略は、ポイント間の重複を最小限に抑え、ポイントを中心にすることだと思います。ここで棒グラフの前に散布図のx個の場所を自動的に選択

ポイントを整理せずに、そのようなプロットの例である:

without organizing the points

私はMATLABとそれの前の点と私の棒グラフを生成するが、私はちょうど最善の方法に興味がありますポイントのx位置の値を選択します。

私は時間がかかりAdob​​e Illustratorの、でその後手でポイントを整理してきました。どんな勧告?これはすでに解決されている問題の副次的な問題ですか?この種のプロットとは何ですか?

サンプルサイズが大きい場合、次のようなものが雲の点より優れていると想像します。

this

Iは、数学的に、y値の一部の配列から出発し、それを再配置することによって、逆に素子間の距離によってスケーリングされたすべての他の要素からすべての要素間の差の和を最大化するであろう、と思います配列内の要素の順序

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]) 
+1

['errorbar'](https://www.mathworks.com/help/matlab/ref/errorbar.html)のようなものは、私が通常は分散を表現する方法として見ると期待されるものです"spread")、それは[棒グラフに追加する]ことができます(https://stackoverflow.com/q/15717139/52738)。 – gnovice

答えて

0

ここで(ヒストグラム)のビンにグループ化に基づいてX位置を決定する一つの方法である:

は、ここでは、グラフを生成するために使用されるMATLABコードです。その結果は、例えば次のようになる。プロットは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') 

これはデータを表示する良い方法であるかどうかは議論の余地があります。

+0

これは私のサンプルコードの代わりになりましたが、私が尋ねようとしていた質問に実際には答えません。 – flailandsail

+0

申し訳ありませんが、私はあなたの質問を誤解しているようです。おそらくあなたは私たちにあなたの手作業で編成されたプロットを見せることで明確になるでしょうすべてのデータポイントを明確に区別できるようにする必要がありますか? [this](https://stackoverflow.com/a/1934882/4720018)(90度回転して各バーに適用)のようなものでしょうか? – Dennis

+0

上記に基づいて答えを更新しました。 – Dennis

関連する問題