matlab - 3D बार प्लॉट में सलाखों के लिए मनमाना रंग कैसे सेट करें?




bar-chart matlab-figure (2)

कहें कि मेरे पास कुछ मानों के साथ एक मैट्रिक्स Z , और मैं इसे Z से ऊंचाई के गुणों की साजिश रचने के द्वारा वर्णन करना चाहता हूं पहला समाधान मन में आता है एक सतह है, लेकिन surf और छोटे मैट्रिक्स के साथ समान फ़ंक्शन का उपयोग करना अच्छा नहीं लगता है।

इसलिए मैंने बार 3 के साथ एक 3D बार bar3 तरह कुछ का उपयोग करने के बारे में सोचा। लेकिन समस्या यह है कि यह फ़ंक्शन हमेशा समूह द्वारा रंग सेट करता है और ऊँचाई से नहीं, और मुझे ऐसा करने के लिए नहीं मिल सकता है।

यहाँ एक उदाहरण है:

Z = peaks(5);
subplot 121
surf(Z)
title('Surface look bad')
subplot 122
bar3(Z)
title('The color is not by height')

मैंने बार bar3 (जैसे CData और FaceColor ) द्वारा लौटाए गए हैंडल में रंग की संपत्तियों को देखने की कोशिश की, लेकिन सभी मूल्यों के साथ खो दिया और वे स्वयं सलाखों से कैसे संबंधित हैं

अंत में, मैं एक सामान्य समाधान करना चाहता हूं जो 2 मैट्रिक्स Z और C द्वारा दिए गए Z और रंग द्वारा दी गई ऊंचाई में सलाखों के साथ एक 3D बार प्लैट बना सकता C

ऐसा मैं किस प्रकार करूं?


फ़ंक्शन बार 3 प्रत्येक वस्तु (प्रत्येक रंग के लिए एक) के लिए एक सतह ऑब्जेक्ट देता है, इसलिए एक समूह में सभी बार अनिवार्य रूप से एक 'टूटी' सतह के रूप में प्लॉट किए जाते हैं इस उत्तर में यह बहुत अच्छा समझाया गया है, इसलिए मैं इसे यहाँ दोहराना नहीं दूंगा।

इसके बजाय, मैं इस विशिष्ट समस्या के समाधान के लिए मिल जाएगा। सतह की प्रासंगिक संपत्ति CData जब हम बार प्लॉट बनाते हैं, प्रत्येक सतह की CData को कुछ आकार में एक मैट्रिक्स के साथ सौंपा जाता है (हम इसे प्राप्त करेंगे) जो सभी बराबर एक मान है। प्रत्येक सतह के लिए एक अलग मूल्य। इस तरह से यह आंकड़ा पूरी तरह से अपने रंगों के रंगों को रंगों के रंगों में बदलता है।

जैसा कि ऊपर लिखे गए (और जुड़े उत्तर में विस्तारित), प्रत्येक समूह सतह से प्रतिनिधित्व करते हैं, इसलिए यह सतह के प्रत्येक बिंदु पर रंग को परिभाषित करने के लिए एक संपूर्ण मैट्रिक्स लेता है। पहली बात हम करना चाहते हैं यह मैट्रिक्स आकार प्राप्त करना है:

Z = peaks(5);
bar_h = bar3(Z);
% we take only the first one, but they are all the same size:
cdata_sz = size(bar_h(1).CData) 

cdata_sz =
    30     4

CData में हमेशा 4 कॉलम होते हैं ( यहां देखें क्यों), और पंक्तियों की संख्या हमेशा 6 * समूहों की संख्या है इसका कारण यह है कि क्षेत्र के ऑब्जेक्ट के साथ एक बंद आयताकार बनाने के लिए 5 शिरोबुण लेता है (आखिरी शिखर पहले की तरह है) और एक पंक्ति NaN के साथ बार के बीच की दूरी के लिए है, इसलिए वे अलग दिखाई देंगे।

इसके बाद, हमें सही तरीके से CData को फिट करने के लिए अपने मूल CData को विस्तारित करने की जरूरत है (जो कि Z का समान आकार)। अनिवार्य रूप से, हम एक ही बार को उसी बार दोहराना चाहते हैं मानते हुए Z भी हमारे रंग डेटा (यानी हम ऊंचाई से रंग) हम करते हैं:

z_color = repelem(Z,6,4)

अब हमें हमारे z_color को हमारे समूहों की संख्या में अलग-अलग कोशिकाओं में विभाजित करने की आवश्यकता है। प्रत्येक कक्ष में एक सतह ऑब्जेक्ट के लिए रंग डेटा शामिल होगा:

z_color = mat2cell(z_color,cdata_sz(1),ones(1,size(Z,2))*cdata_sz(2));

और अंत में, हम बार रंग की साजिश में नया रंग डेटा लागू करते हैं:

set(bar_h,{'CData'},z_color.')

एक बोनस के रूप में, यदि हम अपने बार से सभी शून्य मान हटाना चाहते हैं, तो इसे आसानी से उन्हें NaN पर सेट कर सकते हैं:

Z(abs(Z)<eps) = nan;
C(isnan(Z)) = nan; % if we use a colormap C different from Z

उपरोक्त सभी को इस काम के लिए उबला जा सकता है:

function bar_h = Cbar3(Z,C,b,y)
% Z - The data
% C - CData (if other then Z values)
% b - Minimum absolute value to keep colored
% y - y-axis values to order the data by

if nargin<2, C = Z; end
if nargin<3 || isempty(b), b = 0; end
Z(abs(Z)<b) = nan;
C(isnan(Z)) = nan;
if nargin<4 
    bar_h = bar3(Z);
else
    bar_h = bar3(y,Z);
end
cdata_sz = size(bar_h(1).CData);
z_color = repelem(C,6,4);
z_color = mat2cell(z_color,...
    cdata_sz(1),ones(1,size(Z,2))*cdata_sz(2));
set(bar_h,{'CData'},z_color.')
end

उपयोग का उदाहरण:

subplot 121
Z = peaks(30);
Cbar3(Z,Z,0.5);
pbaspect auto
shading flat % just to get a cleaner look
title('Cbar3 using height as color')

subplot 122
Cbar3(Z,rand(size(Z)),0.5);
pbaspect auto
shading flat % just to get a cleaner look
title('Cbar3 using random as color')

परिणाम:


यह एक आंशिक उत्तर है

बार ऊंचाई के रूप में रंग का उपयोग करने का मामला आधिकारिक MATLAB प्रलेखन द्वारा कवर किया गया है। अनिवार्य रूप से उदाहरण कोड को नीचे फोड़े:

function q45423394
hB = bar3(peaks(25)); colorbar;
for indE = 1:numel(hB)
  hB(indE).CData = hB(indE).ZData;
end

आपको केवल बाद में करने की ज़रूरत है यह सुनिश्चित कर लें कि colormap आप चाहते हैं।







colormap