4

私が抱えている問題について誰かが何かアイデアを持っているかどうか疑問に思っています。

1 つのグラフに表示する必要があるかなりの量のデータがあります。太字で実線の 2 つの理論上の線が上部に表示され、次にこれらの線に収束する 10 の実験データ セットがグラフ化され、それぞれ異なる識別子 (+ または o または四角など) を使用します。これらのグラフは、最大 1e6 までの対数スケールです。グラフの最初の数十年 (< 1e3) は問題ないように見えますが、すべてのデータセットが収束する (> 1e3) ため、どのデータが何であるかを確認するのは非常に困難です。

10 年あたり 1000 を超えるデータ ポイントがあり、ある程度直線的に削除できますが、これをやりすぎると、グラフの下端の解像度が低下します。

私がやりたいことは、対数的に剪定し、ハイエンドで最も強く、0 に戻ることです。私の質問は、線形ではなく対数的にスケーリングされたインデックス ベクトルを取得するにはどうすればよいですか?

私の最初の仮定は、私のデータは lenear であるため、線形インデックスを使用してプルーニングすることができ、次のような結果になるというものでした (ただし、何十年もの間)。

//%grab indicies per decade
ind12 = find(y >= 1e1 & y <= 1e2);
indlow = find(y < 1e2);
indhigh = find(y > 1e4);
ind23 = find(y >+ 1e2 & y <= 1e3);
ind34 = find(y >+ 1e3 & y <= 1e4);

//%We want ind12 indexes in this decade, find spacing
tot23 = round(length(ind23)/length(ind12));
tot34 = round(length(ind34)/length(ind12));

//%grab ones to keep
ind23keep = ind23(1):tot23:ind23(end);
ind34keep = ind34(1):tot34:ind34(end);

indnew = [indlow' ind23keep ind34keep indhigh'];

loglog(x(indnew), y(indnew));

しかし、これによりプルーンは明らかにびくびくした振る舞いをします。各ディケードには希望するポイント数がありますが、線形分布であるため、ポイントは対数スケールでディケードの上限に集中する傾向があります。

どうすればこれを行うことができるかについてのアイデアはありますか?

4

2 に答える 2

3

これを行う最も簡単な方法は、LOGSPACE関数を使用してデータに一連のインデックスを生成することだと思います。たとえば、1 から N (データ内のポイントの数) までの対数間隔で配置された 100 個のポイントのセットを作成するには、次のことを試すことができます。

indnew = round(logspace(0,log10(N),100));  %# Create the log-spaced index
indnew = unique(indnew);                   %# Remove duplicate indices
loglog(x(indnew),y(indnew));               %# Plot the indexed data

このように対数間隔のインデックスを作成すると、ベクターの末尾から選択される値が最初に比べて少なくなるため、ベクターの末尾に向かって値がより厳しく切り捨てられ、対数プロットの外観が改善されます。したがって、昇順でソートされているベクトルで最も効果的です。

于 2010-04-21T05:11:49.437 に答える
1

私が問題を理解する方法は、x値が線形に配置されているため、対数でプロットすると、「上位」の数十年ではるかに多くのデータポイントが存在するため、マーカーが互いに非常に近くなることです。たとえば、xが1から1000になる場合、最初の10年間で10ポイント、2番目で90ポイント、3番目で900ポイントになります。代わりに、たとえば、10年ごとに3ポイントが必要です。

問題を解決する方法は2つあります。簡単な方法は、異なるマーカーの代わりに異なる色の線を使用することです。したがって、データポイントを犠牲にすることはなく、すべてを区別することができます。

2番目の解決策は、不等間隔のインデックスを作成することです。これがあなたがそれをする方法です。

%# create some data
x = 1:1000;
y = 2.^x;

%# plot the graph and see the dots 'coalesce' very quickly
figure,loglog(x,y,'.')

%# for the example, I use a step size of 0.7, which is `log(1)`
xx = 0.7:0.7:log(x(end)); %# this is where I want the data to be plotted

%# find the indices where we want to plot by finding the closest `log(x)'-values
%# run unique to avoid multiples of the same index
indnew = unique(interp1(log(x),1:length(x),xx,'nearest'));

%# plot with fewer points
figure,loglog(x(indnew),y(indnew),'.')
于 2010-04-21T02:24:52.603 に答える