Matlab的填充不适用于semilog或log scale

时间:2014-04-09 21:39:55

标签: matlab plot fill

我使用semilog或loglog缩放时遇到fill()命令问题,让我给你看一个例子,代码:

Rjbs=0.1:0.1:10;
PGAvsr360=[sin(Rjbs)-1; sin(Rjbs) ; sin(Rjbs)+1]';
PGAvsr760=[sin(Rjbs)-1.5; sin(Rjbs)-0.5 ; sin(Rjbs)+0.5]';
figure
plot(Rjbs,PGAvsr360(:,2),'Color', 'b', 'LineWidth', 2)
hold on
plot(Rjbs,PGAvsr760(:,2),'Color', [0 0.6 0], 'LineWidth', 2)
X=[Rjbs,fliplr(Rjbs)];
Y=[PGAvsr360(:,1)',fliplr(PGAvsr360(:,3)')];
fill(X,Y,[0.5 0.5 1], 'FaceAlpha', 0.4)
Y=[PGAvsr760(:,1)',fliplr(PGAvsr760(:,3)')];
fill(X,Y,[0.3 1 0.3], 'FaceAlpha', 0.4)

生成这个漂亮的数字,FaceAlpha功能正常工作 nice

相同的代码,但在两个命令中使用semilogx更改绘图会产生 fail

FaceAlpha功能不起作用。

有没有办法让它发挥作用?

1 个答案:

答案 0 :(得分:3)

似乎没有简单的方法来创建具有对数比例和透明对象的图。 这是因为唯一支持透明度OpenGL的渲染器不支持对数刻度轴。 其他渲染器(ZBuffer,Painters)确实支持对数比例,但不支持透明度。查看更多here(在OpenGL与其他MATLAB渲染器下查看)。

您可以尝试执行此操作的方法是绘制数据的日志并修改刻度标签等。例如

% your code bit that doesn't show transparency
Rjbs=0.1:0.1:10;
PGAvsr360=[sin(Rjbs)-1; sin(Rjbs) ; sin(Rjbs)+1]';
PGAvsr760=[sin(Rjbs)-1.5; sin(Rjbs)-0.5 ; sin(Rjbs)+0.5]';
figure(1) % to comapre with fig 2
semilogx(Rjbs,PGAvsr360(:,2),'Color', 'b', 'LineWidth', 2)
hold on
semilogx(Rjbs,PGAvsr760(:,2),'Color', [0 0.6 0], 'LineWidth', 2)
X=[Rjbs,fliplr(Rjbs)];
Y=[PGAvsr360(:,1)',fliplr(PGAvsr360(:,3)')];
fill(X,Y,[0.5 0.5 1], 'FaceAlpha', 0.4)
Y=[PGAvsr760(:,1)',fliplr(PGAvsr760(:,3)')];
fill(X,Y,[0.3 1 0.3], 'FaceAlpha', 0.4)

ax=get(gca); % important for second part!

% the modification I was talking about 
figure(2);

%# trick #1
RjbsL=log(Rjbs); % I'm just lazy here

X=[RjbsL,fliplr(RjbsL)];
Y=[PGAvsr360(:,1)',fliplr(PGAvsr360(:,3)')];
fill(X,Y,[0.5 0.5 1], 'FaceAlpha', 0.4); hold on
Y=[PGAvsr760(:,1)',fliplr(PGAvsr760(:,3)')];
fill(X,Y,[0.3 1 0.3], 'FaceAlpha', 0.4)
plot(RjbsL,PGAvsr360(:,2),'Color', 'b', 'LineWidth', 2)
plot(RjbsL,PGAvsr760(:,2),'Color', [0 0.6 0], 'LineWidth', 2);hold on

%# trick #2
xlim(log(ax.XLim));
set(gca,'XTick',log(ax.XTick),'XTickLabel',ax.XTickLabel);

enter image description here