2010-04-21 9 views
4

只是想知道如果任何人有任何關於我有問題的想法。修剪數據更好地查看loglog圖 - Matlab

我有相當數量的數據需要顯示在一張圖上。在頂部顯示兩條粗體和實心的理論線,然後聚合到這些線的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)); 

但這會導致剪枝明顯表現出跳躍式的表現。每個十年都有我想要的點數,但由於它是一個線性分佈,所以這些點在對數尺度上趨於在十年的高端結塊。

關於如何做到這一點的任何想法?

+1

我不明白你的問題 - 你可以發佈一個示例圖嗎? – mtrw 2010-04-21 02:04:31

回答

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 

創建這樣一個對數間隔的指數將導致從矢量的末端相對於起點選擇更少的值,從而在矢量的末端更嚴重地修剪值並改善對數圖的外觀。因此,對於按升序排序的向量來說,它將是最有效的。

+0

非常好!我每天都會學到新的東西。 – Jonas 2010-04-21 05:13:27

+0

是的!我最初嘗試使用logspace,但不知道如何正確地執行此任務。謝謝,雖然喬納斯的解決方案有效;這可能更具說服力。 – Geodesic 2010-04-21 05:31:56

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),'.') 
+0

我正在提交的日誌不允許顏色,因此標記 - 但您的解決方案完美工作;謝謝! – Geodesic 2010-04-21 03:19:24

+0

祝您好運! – Jonas 2010-04-21 03:51:36