मैं matlab के xticklabels और yticklabels व्यवहार के एक अनजाने व्यवहार पर ठोकर खाई। मैं xticklabels के आउटपुट को एक चर में संग्रहीत करता हूं, इसे संशोधित करता हूं, फिर इसे फिर से लागू करता हूं और नोटिस करता हूं कि लेबल अब स्थानांतरित हो गए हैं। क्या यह अपेक्षित व्यवहार है, यदि ऐसा है तो क्यों (वैकल्पिक: यह अपेक्षित व्यवहार के रूप में होने का अर्थ क्यों है)?

विचार: प्रत्येक चरण के लिए xticks दिखाएं, लेकिन प्रत्येक दूसरे चरण के लिए केवल लेबल प्रदर्शित करें।

%setup a figure to display
figure;
data=randn(1,21);
plot(-10:10,data);
xlim([-5 10]) %cut out a piece of interest from the data
xticks(-10:2:10); %adjust tick spacing to favorite

%now: keep xticks but remove every 2nd label
lbls=xticklabels;
lbls(1:2:end)={' '}; %set every 2nd label to empty space
pause(1); %take a deep breath...
xticklabels(lbls)

enter image description here enter image description here

4
user2305193 10 अप्रैल 2021, 14:07

1 उत्तर

समस्या यह है कि, जबकि xtick फ़ंक्शन सभी मौजूदा टिक (दृश्यमान और छिपे हुए) का मान देता है, xticklabels फ़ंक्शन केवल दृश्यमान टिक के लेबल लौटाता है। मुझे लगता है कि यह व्यवहार इस तथ्य के कारण है कि MATLAB गैर-दृश्यमान टिकों को कोई लेबल निर्दिष्ट नहीं करता है। इसलिए, आपका xtick वेक्टर है:

[-10 -8 -6 -4 -2 0 2 4 6 8 10]

जबकि आपका xticklabels सेल सरणी है:

{'-4'}, {'-2'}, {'0'}, {'2'}, {'4'}, {'6'}, {'8'}, {'10'}

और, बदलने के बाद:

{' '}, {'-2'}, {' '}, {'2'}, {' '}, {'6'}, {' '}, {'10'}

चूंकि आपकी तस्वीर में केवल दिखाई देने वाली टिक -4 से 10 तक के लोगों को सौंपी गई हैं, इसी दिखाए गए लेबल सेल सरणी में चौथे से अंतिम तक के तत्व हैं। जिन टिकों को एक लेबल असाइन नहीं किया जाता है (क्योंकि टिक से कम लेबल होते हैं) एक खाली सेल की विशेषता होती है:

{'2'}, {' '}, {'6'}, {' '}, {'10'}, {empty}, {empty}, {empty}

समाधान: आपके पास कई समाधान हैं। सबसे पहले उन टिकों को हटाना है जो x-अक्ष की सीमा के अंदर नहीं आते हैं:

%setup a figure to display
figure;
data=randn(1,21);
plot(-10:10,data);
xlim([-5 10]) %cut out a piece of interest from the data
xticks(-10:2:10);  %adjust tick spacing to favorite

% Delete external ticks
xt = xticks();
xl = xlim(); xt(xt<xl(1)) = []; xt(xt>xl(2)) = []; xticks(xt);

%now: keep xticks but remove every 2nd label
lbls=xticklabels;
lbls(1:2:end)={' '}; %set every 2nd label to empty space
pause(1); %take a deep breath...
xticklabels(lbls)

परिणाम(1)

दूसरा समाधान xticks द्वारा लौटाए गए नंबरों को स्ट्रिंग मानों में मैन्युअल रूप से परिवर्तित करने के लिए लेबल असाइन करना है:

%setup a figure to display
figure;
data=randn(1,21);
plot(-10:10,data);
xlim([-5 10]) %cut out a piece of interest from the data
xticks(-10:2:10);  %adjust tick spacing to favorite

%now: keep xticks but remove every 2nd label
lbls= arrayfun(@(x) num2str(x), xticks(), 'UniformOutput', false);
lbls(1:2:end)={' '}; %set every 2nd label to empty space
pause(1); %take a deep breath...
xticklabels(lbls)

परिणाम(2)

आप देखेंगे कि दोनों समाधानों के बीच के निशान अलग-अलग हैं। यह इस तथ्य के कारण है कि दो वैक्टर के बीच सम/विषम तत्व भिन्न होते हैं और इसलिए, विभिन्न तत्वों को व्हाइटस्पेस से बदल दिया जाता है।

4
Gianfranco Di Domenico 10 अप्रैल 2021, 12:48