# +60k Lines on one plot - Too slow

1 view (last 30 days)

Show older comments

Dear all,

I need to plot more than 60k lines. I'm doing it in a for loop. It takes too much time, about 170 seconds with the rest of the code. Is there any quicker way?

And also saveas(fig ... command takes too much time as well. About 60 seconds. I would like to save my plot as a png. file.

What are your suggestions to reduce time cost.

Best Regards,

### Accepted Answer

Adam Danz
on 25 Jun 2022

Edited: Adam Danz
on 25 Jun 2022

Pros:

- 1 graphics object, light weight plot
- simple to compute & simple to plot
- you can see the density patterns created by overlapping lines etc.
- If there is a strong median curve, you'll see it in the plot

Cons:

- Single curves won't appear in the plot (but you wouldn't see many single curves anyway with 60k lines)
- Outliers may become difficult or impossible to see

Example

Create 10k line series that follow a general pattern with varying amounts of noise. I'll use the same x-coordinates but this works just as well if the x-values vary too.

gaus = @(x,mu,sig,amp,vo)amp*exp(-(((x-mu).^2)/(2*sig.^2)))+vo;

x = 0:850;

n = 1e4;

y = zeros(n,numel(x));

rng('default') % to reproduce these results

for i = 1:n

mu = rand(1)*175+300;

sig = rand(1)*100+150;

amp = randn(1)*20+30;

vo = rand(1)*10;

y(i,:) = gaus(x,mu,sig,amp,vo);

end

Now, let's plot 50 random lines to see what they look like. Use randperm to do the random selection.

figure

m = 50;

selection = randperm(n,m);

plot(x, y(selection,:))

title(sprintf('%d random curves from %d',m,n))

axis tight

% Replicate the X-vector (skip this if your x values vary for each curve)

xRep = repmat(x, n, 1);

% plot the bivariate historgram

figure

h = histogram2(xRep(:),y(:),'DisplayStyle','tile','ShowEmptyBins','on');

title('Bivariate density of curves')

cb = colorbar();

ylabel(cb,'Number of curves')

Alternatively, you could turn off the empty bins to see the shape of the entire dataset

figure

h = histogram2(xRep(:),y(:),'DisplayStyle','tile');

title('...ignoring empty bins')

cb = colorbar();

ylabel(cb,'Number of curves')

### More Answers (2)

dpb
on 25 Jun 2022

Edited: dpb
on 25 Jun 2022

This is way too much data to plot on single figure realistically, of course it's going to take time.

But, the use of a loop and plot is the slowest way possible -- you're computing/drawing every single line individually instead of using the power of MATLAB in being vectorized...

y=[slopes(:,1)*energy+slopes(i,2)].'; % generate y(i,j) by column

hL=plot(energy,y); % plot the result

Here on a not terribly upscale system,

>> tic,y=m*e;toc

Elapsed time is 0.001305 seconds.

>> tic,hL=plot(e,y);toc

Elapsed time is 15.350194 seconds.

>> delete(hL)

>> close

although it took the renderer quite some additional time to actually draw and display the figure -- and at least as long to delete 60K graphics handles.

Since there are only some 1-2K pixels on a monitor anyway, 60K points is some 60X the possible density to be able to display; I would strongly suggest decimating the y array by at least a factor of 10 and likely you'll be unable to see any difference in the result at factors approaching 100X.

Image Analyst
on 25 Jun 2022

### See Also

### Categories

### Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!