MATLAB Answers

Bars disappear with log scale

조회 수: 12(최근 30일)
wael Ghareeb
wael Ghareeb 2021년 6월 1일
댓글: wael Ghareeb 2021년 6월 1일
Executing the following four commands
Y = count(1:10,:);
figure
bar3h(Y,'grouped')
set(gca,'YScale','log')
gives me the plot without the bars? how could I restore the body of each bar?
Thanks for any help
  댓글 수: 1
Adam Danz
Adam Danz 2021년 6월 1일
@wael Ghareeb Welcome to the forum. I've edited your question to format your code. In the future please use the code/text toggle in rich text editor to format your code.

댓글을 달려면 로그인하십시오.

채택된 답변

Adam Danz
Adam Danz 2021년 6월 1일
Reproducing the problem
Well, that's interesting. The plot on the left shows the bar plot with a linear y-axis and the plot on the right is the same bar plot but with a log y-axis.
load count.dat % built-in
Y = count(1:10,:);
figure
subplot(1,2,1)
bar3h(Y,'grouped')
xlabel('x axis')
ylabel('y axis')
zlabel('z axis')
title('Linear y scale')
subplot(1,2,2)
bar3h(Y,'grouped')
set(gca,'YScale','log')
xlabel('x axis')
ylabel('y axis')
zlabel('z axis')
title('Log y scale')
Cause of the problem
The 3D bar plots are constructed by surfaces stored in the output to bar3h. The horizontal walls extend from y=0 to the height of the each bar. When converting the y-axis to a log scale, log(0) returns -inf which cannot be plotted so the sections of the surfaces that include vertices at y=0 vanish. This does not affect the tops of each bar unless the tops are at y=0.
Solution
After constructing the bar plot, change values equal to or less than y=0. In the example below, they are changed to 1; log(1)=0.
load count.dat % built-in
Y = count(1:10,:);
figure
subplot(1,2,1)
bar3h(Y,'grouped')
xlabel('x axis')
ylabel('y axis')
zlabel('z axis')
title('Linear y scale')
subplot(1,2,2)
bh = bar3h(Y,'grouped');
for i = 1:numel(bh)
zeroIdx = bh(i).YData == 0;
bh(i).YData(zeroIdx) = 1;
end
set(gca,'YScale','log')
xlabel('x axis')
ylabel('y axis')
zlabel('z axis')
title(['Log y scale with',newline,'y=0 adjustment'])
  댓글 수: 1
wael Ghareeb
wael Ghareeb 2021년 6월 1일
Thank you for your help and explanation.

댓글을 달려면 로그인하십시오.

추가 답변(1개)

Joseph Cheng
Joseph Cheng 2021년 6월 1일
While not ideal this should get you by since bar tries to plot the bar all the way to 0 which log scales don't show
y=randi(100,10,10);
figure(1),clf
hbar = bar3h(y,'grouped')
hbar =
1×10 Surface array: Surface Surface Surface Surface Surface Surface Surface Surface Surface Surface
set(gca,'Yscale','log')
minY2plt = 0.001;
for ind = 1:10
hbar(ind).YData(hbar(ind).YData==0)=minY2plt;
end
ylim([minY2plt max(y(:))])
  댓글 수: 1
wael Ghareeb
wael Ghareeb 2021년 6월 1일
Thank you for you help. It works.

댓글을 달려면 로그인하십시오.

태그

Community Treasure Hunt

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

Start Hunting!

Translated by