shade area under a semilog plot

10 ビュー (過去 30 日間)
monkey_matlab
monkey_matlab 2015 年 7 月 27 日
コメント済み: Star Strider 2015 年 7 月 27 日
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 件のコメント
Muthu Annamalai
Muthu Annamalai 2015 年 7 月 27 日
Your problem seems to be that X-axis on subplot(1,2,2) is linearly spaced instead of it being log spaced.

サインインしてコメントする。

採用された回答

Star Strider
Star Strider 2015 年 7 月 27 日
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 件のコメント
monkey_matlab
monkey_matlab 2015 年 7 月 27 日
編集済み: monkey_matlab 2015 年 7 月 27 日
Just one more thing, when I tried your solutions, for some reason, the second plot has a different x-axis starting than the first sub-plot. Do you know what might be causing this difference??
Star Strider
Star Strider 2015 年 7 月 27 日
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.)

サインインしてコメントする。

その他の回答 (2 件)

Muthu Annamalai
Muthu Annamalai 2015 年 7 月 27 日
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);

Azzi Abdelmalek
Azzi Abdelmalek 2015 年 7 月 27 日
Use
H1=area(log10(freq),pnoise)
  1 件のコメント
monkey_matlab
monkey_matlab 2015 年 7 月 27 日
Hello, I tried your answer, but this is what I got as the output:

サインインしてコメントする。

カテゴリ

Help Center および File Exchange2-D and 3-D Plots についてさらに検索

Community Treasure Hunt

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

Start Hunting!

Translated by