簡體   English   中英

Plot 圓圈與 MATLAB 中的 alpha 值

[英]Plot circles with alpha values in MATLAB

我正在創建一些數據的散點 plot,就像你一樣,我有許多重復的數據點,我想將 plot 作為具有一些 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

如您所見,這不是最佳選擇,因為我需要知道並在 plot 之前設置 plot ( xlimylim )的大小,以便圓圈最終成為圓形。 如果我重塑 plot 那么它們最終會變成橢圓形。 我最終也得到了數百萬個對象,這在制作傳說時很痛苦。

有沒有更簡單的方法?

我發現沒有辦法在MATLAB中使用帶有 alpha 的線標記。

如果您查看線屬性(圖后面的(中)低級 function),您將看到您可以定義標記,它們的唯一屬性是它們的顏色( MarkerEdgeColorMarkerFaceColor ),它不帶任何 alpha(沒有MarkerFaceAlpha屬性)。

所以你如何使用補丁似乎是 go 的方式。

我唯一可以建議避免擁有無數對象的方法是將它們分組到一個hggroup中,這將使它們在圖例中顯示為單個 object 。

我有同樣的問題,我的散點 plot 有 100,000 點。 答案#2 的想法很棒,但我在 Illustrator 中打開 plot 是不切實際的,因為我的分數太多。 所以我將答案#2改編成批處理:

將圖形打印到 matlab 中的 pdf 文件中:

print -dpdf foo.pdf

使用來自 debian ZEFE90A8E604A7C8B70E88 的 pdf2svg 將 pdf 文件轉換為 svg

pdf2svg foo.pdf foo.svg

使所有藍色物體透明:

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

convert foo2.svg to pdf using rsvg-convert from debian package librsvg2-bin:

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

我嘗試使用patch做一個通用的 function 。 它很慢而且有點錯誤,但它適用於簡單的情況。 MATLAB需要一個實線 alpha。

xy是指向 plot 的點, 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

patchline Exchange 上找到補丁行 function ,它可以采用任何patch arguments 包括'FaceAlpha'

http://www.mathworks.com/matlabcentral/fileexchange/36953-patchline/content/patchline.m

據我所知,沒有辦法直接為MATLAB中的標記設置 alpha。 當 alpha 設置為低於 0.03 或有超過 10,000 個標記時,補丁方法無法正常工作。

當您有大量標記時生成出版質量圖形的解決方法是為標記提供獨特的顏色。 然后將圖形打印到EPS 然后在Illustrator中打開 select 所有該顏色的對象,並在 Illustrator 中設置對象的透明度和顏色。 這不是人們希望的一步解決方案,但它確實提供了比使用內部 MATLAB 功能更好的結果,而且速度很快,只要您有 Illustrator 或等效的矢量圖形 package。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM