只是想知道是否有人对我遇到的问题有任何想法。
我有大量数据需要显示在一张图表上。顶部显示两条粗体和实线的理论线,然后绘制收敛到这些线的 10 个实验数据集,每个使用不同的标识符(例如 + 或 o 或正方形等)。这些图采用最大 1e6 的对数刻度。图表的前几十年 (< 1e3) 看起来不错,但随着所有数据集的收敛 (> 1e3),真的很难看出数据是什么。
每十年有超过 1000 个数据点,我可以在一定程度上线性修剪,但如果我这样做太多,图表的低端将受到分辨率的影响。
我想做的是对数修剪,在高端最强,回到 0。我的问题是:如何获得对数缩放的索引向量而不是线性索引向量?
我最初的假设是,由于我的数据是线性的,我可以只使用线性索引来修剪,这导致了这样的结果(但几十年来):
//%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));
但这显然会导致修剪器表现出神经质的行为。每个十年都有我想要的点数,但由于它是线性分布,因此这些点往往聚集在对数尺度上十年的高端。
关于如何做到这一点有什么想法吗?
最佳答案
我认为最简单的方法是使用 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
像这样创建对数间隔的索引将导致从向量末尾选择的值相对于开始更少,从而更严格地修剪向量末尾的值并改善对数图的外观。因此,使用按升序排序的向量最有效。
关于matlab - 修剪数据以便在对数对数图上更好地查看 - Matlab,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2679842/