shade area under a semilog plot
12 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 2-D and 3-D 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!