2011-05-05 50 views
6

我創建了一些數據的散點圖,與您一樣,並且我有一些重複的數據點,我想用一些alpha值將其繪製爲圓形,以便打樁在同一地點加分是顯而易見的。在MATLAB中繪製帶有alpha值的圓圈

至於我可以告訴你不能設置你plot(x, y, 'o')產生的小圓圈的alpha屬性,所以我採取使用patch()吸引了成千上萬的小圓圈的自己:

x = repmat([1:10], [1 10]); 
y = round(10*rand(100, 1))/10; 
xlim([0 11]) 
ylim([0 1]) 
p = ag_plot_little_circles(x', y, 10, [1 0 .4], 0.2); 

function p = ag_plot_little_circles(x, y, circle, col, alpha) 
%AG_PLOT_LITTLE_CIRCLES Plot circular circles of relative size circle 
% Returns handles to all patches plotted 

    % aspect is width/height 
    fPos = get(gcf, 'Position'); 
    % need width, height in data values 
    xl = xlim(); 
    yl = ylim(); 
    w = circle*(xl(2)-xl(1))/fPos(3); 
    h = circle*(yl(2)-yl(1))/fPos(4); 

    theta = 0:pi/5:2*pi; 
    mx = w*sin(theta); 
    my = h*cos(theta); 
    num = 0; 
    for k = 1:max(size(x)) 
     for f = 1:size(y,2) 
      num = num+1; 
      p(num) = patch(x(k)+mx, y(k,f)+my, col, 'FaceColor', col, 'FaceAlpha', alpha, 'EdgeColor', 'none'); 
     end 
    end 
end 

正如你可以看到,這並不是最優的,因爲我需要知道並設置圖的大小(xlimylim),然後再繪製它以便圓圈最終呈圓形。如果我重塑劇情,那麼他們最終會成爲橢圓形。我也結束了數以百萬計的物體,這是傳說中的一種痛苦。

有沒有更簡單的方法?

+2

您可以加入一個例子調用你的函數?沒有必要詳細閱讀以弄清楚語法會更容易... – abcd 2011-05-05 06:34:59

+0

是的,好主意。 – Alex 2011-05-05 08:42:47

+0

隨着新的matlab發佈,它似乎是可能的,但它仍然是無證的。見[這裏](http://undocumentedmatlab.com/blog/plot-markers-transparency-and-color-gradient) – WYSIWYG 2015-07-01 09:57:13

回答

4

我發現沒有辦法在MATLAB中有alpha標記。

如果您查看線屬性(圖中背後的(中)低級功能),您將看到您可以定義標記,並且它們的唯一屬性是它們的顏色(MarkerEdgeColorMarkerFaceColor),它不需要任何alpha (沒有MarkerFaceAlpha財產)。

所以你如何用補丁來做到這一點看起來是一種很好的方式。

我可以建議避免擁有數量衆多的對象的唯一方法是將它們歸爲一個hggroup,這將使它們在圖例中顯示爲單個對象。

3

我試圖使用patch來執行一般功能。這很慢,有點bug,但對於簡單的情況,它工作正常。 MATLAB需要一個實際的alpha值。

xy是點積,w的線的寬度,col顏色和a alpha值。

例子:

x = linspace(-2,2,100); 
plotWithAlpha(x,sin(4*x),0.04,'r',0.2) 


function [] = plotWithAlpha(x,y,w,col,a) 
%function [] = plotWithAlpha(x,y,w,col,a) 
    if(size(x,1) ~= 1) 
     x = x.'; 
    end 

    if(size(x,1) ~= 1) 
     y = y.'; 
    end 

    sz = length(x); 

    % Calculate derrivatives of the curve 
    X = csaps(1:sz(1),x,1); 
    Y = csaps(1:sz(1),y,1); 

    mx = fnval(fnder(X,1),1:sz(1)).'; 
    my = fnval(fnder(Y,1),1:sz(1)).'; 

    T = [mx my]; %tangent 

    % Normalize tangents 
    T = bsxfun(@rdivide,T,sqrt(sum(T.^2,2))); 

    N = zeros(size(T)); 

    N(:,2) = 1; 
    N(:,1) = -T(:,2)./T(:,1); 

    N = bsxfun(@rdivide,N,sqrt(sum(N.^2,2))); 

    N = N.'; 

    hold on 

    for i = 2:length(x) 
     X = [x(i-1)+w*N(1,i-1) x(i)+w*N(1,i) x(i-1)-w*N(1,i-1) x(i)-w*N(1,i)]; 
     Y = [y(i-1)+w*N(2,i-1) y(i)+w*N(2,i) y(i-1)-w*N(2,i-1) y(i)-w*N(2,i)]; 

     % Order the points 
     D = pdist([X' Y']); 
     D = squareform(D); D(D==0) = Inf; 

     inds = 1; 
     D(:,1) = Inf; 

     [val ind] = min(D(1,:)); 
     inds(2) = ind; 
     D(:,ind) = Inf; 

     [val ind] = min(D(ind,:)); 
     inds(3) = ind; 
     D(:,ind) = Inf; 

     inds(4) = setxor(inds,1:4); 

     X = X(inds); 
     Y = Y(inds); 

     patch(X,Y,col,'edgeColor','none','FaceAlpha',a) 
    end 

    hold off 
2

據我所知,沒有辦法直接設置阿爾法在MATLAB標記。當alpha設置在大約0.03以下或者有10,000多個標記時,補丁方法無法正常工作。

當您擁有濃密的標記雲時,生成發佈質量圖形的解決方法是爲標記提供唯一的顏色。然後打印該圖到EPS。然後在Illustrator中打開,選擇該顏色的所有對象,並在Illustrator中設置對象的透明度和顏色。這不是人們希望的一步式解決方案,但它提供了比使用MATLAB內部函數好得多的結果,並且速度很快,只要您有Illustrator或等效的矢量圖形包。

3

我有同樣的問題,我的散點圖有100,000點。 答案#2的想法很好,但是我在Illustrator 中打開我的情節是不切實際的,因爲我有太多的觀點。所以我適應答案#2成批處理過程:

打印圖形到PDF文件在MATLAB:

print -dpdf foo.pdf 

轉換PDF文件使用pdf2svg從Debian軟件包pdf2svg爲SVG:

pdf2svg foo.pdf foo.svg 

使所有藍色對象透明:

sed '/rgb(0%,0%,100%)/s/fill-opacity:1/fill-opacity:.2' <foo.svg> foo2.svg 

轉換foo2.svg爲​​PDF使用RSVG變頻從Debian軟件包 librsvg2斌:

rsvg-convert -f pdf -o foo2.pdf foo2.svg