[英]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 ( xlim
和ylim
)的大小,以便圓圈最終成為圓形。 如果我重塑 plot 那么它們最終會變成橢圓形。 我最終也得到了數百萬個對象,這在制作傳說時很痛苦。
有沒有更簡單的方法?
我有同樣的問題,我的散點 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。
x
和y
是指向 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.