修剪数据以便在loglog图上更好地查看 - Matlab

时间:2010-04-21 02:01:40

标签: matlab indexing graph visualization logarithm

只是想知道是否有人对我遇到的问题有任何想法。

我需要在一个图表上显示相当数量的数据。在顶部显示两个粗体和实线的理论线,然后绘制收敛到这些线的10个实验数据集,每个使用不同的标识符(例如+或o或正方形等)。这些图表的对数刻度最高可达1e6。图表的前几十年(< 1e3)看起来很好,但是当所有数据集收敛(> 1e3)时,很难看出哪些数据是什么。

每十年有超过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));

但是这会导致修剪显然表现得很突然。每个十年都有我想要的点数,但由于它是一个线性分布,这些点在对数尺度上往往会在十年的高端聚集。

关于我如何做到这一点的任何想法?

2 个答案:

答案 0 :(得分:3)

我认为最简单的方法是使用LOGSPACE函数为数据生成一组索引。例如,要创建一组100个点,对数间隔从1到N(数据中的点数),您可以尝试以下操作:

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

创建像这样的对数间隔索引将导致从向量的末端相对于开始选择的值更少,因此在向量的末尾更严格地修剪值并改善对数图的外观。因此,对于按升序排序的向量,它将是最有效的。

答案 1 :(得分:1)

我理解这个问题的方法是你的x值是线性间隔的,所以如果你以对数方式绘制它们,那么在'更高'的几十年里会有更多的数据点,所以标记彼此非常接近。例如,如果x从1变为1000,则第一个十年中有10个点在第二个十年中有90个点,第三个中有900个点。你想要比较每十年3分。

我看到两种解决问题的方法。更容易的是使用不同颜色的线而不是不同的标记。因此,您不会牺牲任何数据点,您仍然可以区分所有数据。

第二种解决方案是创建不均匀间隔的索引。这是你如何做到的。

%# 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),'.')