shade area under a semilog plot
13 views (last 30 days)
Show older comments
monkey_matlab
on 27 Jul 2015
Commented: Star Strider
on 27 Jul 2015
In the code below, I would like to shade the area between freq = 300 to freq = 3000:
freq = 100:1:10000;
pnoise = -60:-.01:-159;
subplot(1, 2, 1);
semilogx(freq,pnoise); grid on; axis([0 10^5 -160 -70]);
title('Original Plot');
xlabel('Frequency (Hz)'); ylabel('Amplitude');
subplot(1, 2, 2);
H1=area(semilogx(freq,pnoise)); grid on; axis([0 10^5 -160 -70]);
hold on
title('Plot with Area Shaded');
xlabel('Frequency (Hz)'); ylabel('Amplitude');
idx=freq>300&freq<3000;
H=area(freq(idx),pnoise(idx));
set(H(1),'FaceColor',[1 0.5 0]);
However, I am not getting the second plot to show up with the shaded region correctly. Any help is appreciated.
1 Comment
Muthu Annamalai
on 27 Jul 2015
Your problem seems to be that X-axis on subplot(1,2,2) is linearly spaced instead of it being log spaced.
Accepted Answer
Star Strider
on 27 Jul 2015
It took a bit of experimenting with the patch function. See if this does what you want:
freq = 100:1:10000;
pnoise = -60:-.01:-159;
subplot(1, 2, 1);
semilogx(freq,pnoise); grid on; axis([0 10^5 -160 -70]);
title('Original Plot');
xlabel('Frequency (Hz)'); ylabel('Amplitude');
subplot(1, 2, 2);
semilogx(freq,pnoise)
hold on
title('Plot with Area Shaded');
xlabel('Frequency (Hz)'); ylabel('Amplitude');
idx=freq>300&freq<3000;
minpnoise = pnoise(find(idx,1,'last'));
patch([300 freq(idx) 3000 300], [-160 pnoise(idx) -160 -160], [1 0.5 0]);
grid on; axis([0 10^5 -160 -70]);

2 Comments
Star Strider
on 27 Jul 2015
I have no idea. The only possibility I can think of is to see if putting the axis call closer to the semilogx call in the second subplot makes a difference.
My code produced the plot I posted (that seems correct), so I would not be able to reproduce your result. (I’m using R2015a.)
More Answers (2)
Muthu Annamalai
on 27 Jul 2015
Hello @monkey_matlab,
After some experimenting I find the following a interesting variant for your requirement,
close all
freq = 100:1:10000;
pnoise = -60:-.01:-159;
subplot(1,2,1)
semilogx(freq,pnoise); grid on; axis([0 10^5 -160 -70]);
title('Original Plot');
xlabel('Frequency (Hz)'); ylabel('Amplitude');
subplot(1,2,2)
H=semilogx(freq,pnoise);grid on; axis([0 10^5 -160 -70]);
grid on;
title('Plot with Area Shaded');
xlabel('Frequency (Hz)'); ylabel('Amplitude');
vert = linspace(-160,-70,100);
H = gca
hline1 = line(ones(1,100)*300,vert, ...
'LineWidth',4,...
'Color','red',...
'Parent',H);
hline2 = line(ones(1,100)*3000,vert, ...
'LineWidth',4,...
'Color','red',...
'Parent',H);
0 Comments
See Also
Categories
Find more on Log Plots in Help Center and File Exchange
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!