当我将YScale设置为log时,为什么我的XTickLabel会在MATLAB中消失?

时间:2014-08-11 01:10:39

标签: matlab

当我将YScale设置为log时,为什么xticklabels会消失?

x = [1 2 3 4 5 6 7 8 9 10];
y = [0 1000 400 1 0 80000 500 100 1 200];
my_labels = [{'these', 'are', 'my', 'labels', 'to', 'use', 'for', 'my', 'cool', 'plot'}];
h2 = scatter(x,y,50,'b','o');
Xt = 1:1:10;
Xl = [1 10];
set(gca,'XTick',Xt,'XLim',Xl);
ax = axis;    
axis(axis);    
Yl = ax(3:4);  
delta=1000;
t = text(Xt,Yl(1)*ones(1,length(Xt))-delta,my_labels(1:1:10));
set(t,'HorizontalAlignment','right','VerticalAlignment','top', ...
          'Rotation',45,'fontsize',6);
set(gca,'XTickLabel','')
box on
set(gca,'YScale','log')

1 个答案:

答案 0 :(得分:2)

那是因为你这样做了:

set(gca,'XTickLabel','')  

此声明出现在您向我们展示的代码的第三行。您正在使x-tick标签消失,因为您正在通过此语句清除所有标签。在您将YScale设置为log之后,所有标签都会被删除,因为您在该语句发生之前清除了x-tick标签:)

删除该语句并再次尝试使用您的代码。

修改

它无法正常工作的原因是,当您进入log比例时,y限制不能为负数。这是semilog图,这意味着y轴的最小值必须为正。因此,您需要修改代码,以便文本值的y值至少为1,而不是负数。这样就可以在不离开屏幕的情况下获得。因此,您需要这样做:

x = [1 2 3 4 5 6 7 8 9 10];
y = [0 1000 400 1 0 80000 500 100 1 200];
my_labels = {'these', 'are', 'my', 'labels', 'to', 'use', 'for', 'my', 'cool', 'plot'};
h2 = scatter(x,y,50,'b','o');
Xt = 1:1:10;
Xl = [1 10];
set(gca,'XTick',Xt,'XLim',Xl);
%//ax = axis;    %// Remove because not possible
%//axis(axis);    
%//Yl = ax(3:4);  
%//delta=1000;
t = text(Xt,ones(1,length(Xt)),my_labels(1:1:10)); %// Change here
set(gca,'XTickLabel','') %// Move here
set(t,'HorizontalAlignment','right','VerticalAlignment','top', ...
          'Rotation',45,'fontsize',6);
box on
set(gca,'YScale','log')

这是我得到的情节: enter image description here


通常,如果您希望此方法有效,则应为文本值设置y值,使其为y值日志的最小值如果您的y值为零,则添加1 。这是因为当您为log值执行y缩放时,所有这些值都会应用log10操作。换句话说,将text语句更改为:

t = text(Xt,min(log10(y + 1))*ones(1,length(Xt)),my_labels(1:1:10));

无论您的y值如何,这都应该有效。但是,由于您正在制作log图,因此您需要确保y值为> 0

祝你好运!