当我将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')
答案 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')
这是我得到的情节:
通常,如果您希望此方法有效,则应为文本值设置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
。