2016-04-07 55 views
5

我一直試圖獲得半透明圓形標記對數對數散點圖。 MATLAB自己scatter繪圖功能不會產生半透明標記(參見下面的註釋),所以我用這個奇妙的工具scatter_patchesCentral File Exchange和它工作得很好:對數對數散點圖上的半透明標記

不過,我有問題適應了這個代碼對數 - 對數散點圖。爲了獲得這個程序的對數 - 對數散點圖,我需要修復兩件事:

1。將軸更改爲對數刻度。這可以通過在61行之後添加以下內容來實現:

set(cax, 'XScale', 'log'); 
set(cax, 'YScale', 'log'); 

這會生成正確的對數標度和網格點。

2。但是,在我修正了1.之後,標記的大小在我的情節中並不統一。在日誌圖上,軸的較低值區域被放大。在scatter_patches圖中,座標軸下側的標記越大,朝向座標軸越高的一側越小。所以,整個地塊的標記大小並不相同。我嘗試使用log10(cSize)而不是cSize在第221-222行,但這只是減少了最大和最小標記大小之間的差異。它在圖上沒有產生相同大小的標記。

如果有人對我在這裏可能錯過的東西有所瞭解,請分享。

任何幫助將不勝感激。

+0

您是否嘗試過使用Matlab的scatter plot with'set(hadle_to_scatterplot,'MarkerFaceColor','None')'?看起來像'scatter_patches'創建一個圓圈而不是標記。 – Crowley

+0

我試過了。將「MarkerFaceColor」設置爲「無」與將透明度設置爲100%等效。但是,我想控制透明度。如果像'MarkerFaceAlphaValue'這樣的屬性存在,那麼我可以將透明度設置爲任意值。但是這樣的財產不存在。 scatter_patches使用補丁代替標記;所以可以設置FaceAlphaValue。該程序還允許創建其他形狀,而不僅僅是圓形。該程序在線性圖上效果很好。這是需要進行一些更改的日誌圖。 – user164568

+0

我認爲,這[文章](您可能會感興趣的話)(http://ch.mathworks.com/matlabcentral/answers/263990-how-to-draw-a-circle-in-a-log-log-plot)。你有嘗試在這裏添加'exp()':set(patchObjects(i),'XData',cSize * sin(patchSpec)/ ptsPerXUnit + xs(i)); (patchSpec)/ ptsPerYUnit + ys(i));'like'set(patchObjects(i),'XData',cSize * exp(sin(patchSpec))/ptsPerXUnit + xs(i));'但我沒有試過! – obchardon

回答

6

由於Matlab R2014b事情變得非常簡單。不需要文件交換的附加功能,只需要一些undocumented features。基本思路是獲取標記的隱藏句柄並對EdgeColorData中的最後一個值應用值以獲得期望的透明度。

這裏,我們去:

%// example data 
x = linspace(0,3*pi,200); 
y = cos(x) + rand(1,200); 

%// plot scatter, get handle 
h = scatter(x,y); 
drawnow; %// important 

%// get marker handle 
hMarkers = h.MarkerHandle; 

%// get current edge and face color 
edgeColor = hMarkers.EdgeColorData 
faceColor = hMarkers.FaceColorData 

%// set face color to the same as edge color 
faceColor = edgeColor; 

%// opacity 
opa = 0.3; 

%// set marker edge and face color 
hMarkers.EdgeColorData = uint8([edgeColor(1:3); 255*opa]); 
hMarkers.FaceColorData = uint8([faceColor(1:3); 255*opa]); 

enter image description here

+0

我試過這個。但是,這似乎隻影響邊緣的透明度,而不是標記的面部。 – user164568

+0

可以肯定,您的方法將'hMarkers.EdgeColorData'尺寸從'1x1x3'更改爲'1x1x4',其中'圖層'分別代表紅色,綠色,藍色和不透明度通道?換句話說,是否可以假設'uint8'大小爲'M×N×4'的數組代表寬度爲M像素的紋理貼圖,具有定義顏色的N像素高度和每個像素的不透明度? – Crowley

+1

@ user164568我有MATLAB 2011b,所以我不能嘗試。您是否嘗試過使用'hMarkers.FaceColorData'? – Crowley

0

線192改變這一個行:

hh(end+1) = patch(exp(cSize * sin(patchSpec)/ptsPerXUnit + xs(i)), exp(cSize * cos(patchSpec)/ptsPerYUnit + ys(i)), cColor, cPatchArgs{:});,它會工作。

我只需要加一個exp()

執行相同的操作就行222和223是肯定的!

工作像魅力Anindya;)。

+0

我的圖是log10規模。所以我用'hh(end + 1)= patch(10。^((cSize * sin(patchSpec)/ ptsPerXUnit + xs(i))./ 10),10。^((cSize * cos(patchSpec)/ ptsPerYUnit + ys(i))./ 10),cColor,cPatchArgs {:});'這肯定會產生相同大小的圓。但是,我的圖與MATLAB的散點圖函數生成的圖不一樣。看到這裏:http://imgur.com/21yM6hY – user164568

1

在它的幫助,我已經寫了Matlab中函數的集合,用於創建在情節和傳說半透明的標誌事件。這些文件可以從MATLAB Central以MarkerTransparency包的形式獲得。下載中包含幾個如何使用這些功能的例子,並且還有一個關於GitHub的Wiki。這個軟件包的一個主要優點是它使用戶能夠在圖例中顯示半透明標記。這些功能尚未經散點圖測試,但可能很容易適應您的需求。