matlab - क्वैर 3 तीर का रंग परिमाण के अनुरूप है




matlab-figure (2)

पुराने ग्राफिक्स सिस्टम (R2014a और पहले) में बिल्ट-इन quiver ऑब्जेक्ट का उपयोग करना संभव नहीं है। आप आसानी से उन सभी वस्तुओं को प्राप्त कर सकते हैं जिनका उपयोग quiver भूखंड की रचना के लिए किया जाता है

q = quiver(1:5, 1:5, 1:5, 1:5);
handles = findall(q, 'type', 'line');

लेकिन पूंछ सभी को एक भूखंड वस्तु द्वारा दर्शाया जाता है, और तीर प्रमुख दूसरे द्वारा दर्शाए जाते हैं। जैसे, आप प्रत्येक सिर / पूंछ के रंग को अलग-अलग नहीं बदल सकते।

set(handles(1), 'Color', 'r')
set(handles(2), 'Color', 'g')

हालांकि, HG2 (R2014b और बाद में) की शुरुआत के साथ, आप वास्तव में दो ( LineStrip ) LineStrip ऑब्जेक्ट ( matlab.graphics.primitive.world.LineStrip ) तक पहुंच प्राप्त कर सकते हैं (एक सिर का प्रतिनिधित्व करता है और एक पूंछ का प्रतिनिधित्व करता है)। ये छिपे हुए गुण Tail और Head माध्यम से सुलभ हैं।

q = quiver(1, 1, 1, 1);
headLineStrip = q.Head;
tailLineStrip = q.Tail;

फिर आप प्रत्येक तीर को एक अलग रंग बनाने के लिए इन वस्तुओं के रंग गुणों को बदल सकते हैं।

मूल विचार

ऐसा करने के लिए, मैं सबसे पहले सभी तरकश तीरों के परिमाण की गणना करता हूं (यह quiver और quiver दोनों के लिए काम करता है)

mags = sqrt(sum(cat(2, q.UData(:), q.VData(:), ...
            reshape(q.WData, numel(q.UData), [])).^2, 2));

फिर मैं आरजीबी मूल्य के लिए प्रत्येक परिमाण को मैप करने के लिए वर्तमान कॉलोर्मैप का उपयोग करता हूं। सबसे छोटे तीर को कोलरमैप पर सबसे कम रंग दिया गया है और सबसे लंबे तीर को कॉलॉर्मैप पर उच्चतम रंग सौंपा गया है। histcounts प्रत्येक परिमाण को एक सूचकांक निर्दिष्ट करने के लिए महान काम करता है जिसे ind2rgb के साथ-साथ ind2rgb पारित किया जा सकता है। हमें 255 से गुणा करना होगा क्योंकि हमें 8-बिट पूर्णांक के रूप में आरजीबी होने की आवश्यकता है।

% Get the current colormap
currentColormap = colormap(gca);

% Now determine the color to make each arrow using a colormap
[~, ~, ind] = histcounts(mags, size(currentColormap, 1));

% Now map this to a colormap
cmap = uint8(ind2rgb(ind(:), currentColormap) * 255);

LineStrip ColorData प्रॉपर्टी (जब ColorData रूप में निर्दिष्ट होती है) को एक अल्फा चैनल (जिसे हम 255 अर्थ अपारदर्शी पर सेट करेंगे) की आवश्यकता होती है।

cmap(:,:,4) = 255;

इस बिंदु पर हम फिर ColorBinding संपत्ति को object बजाय interpolated करने के लिए सेट कर सकते हैं (इसे quiver ऑब्जेक्ट से ColorData लिए) और दोनों के ColorData गुण को सेट करें। प्रत्येक तीर देने से ऊपर हमने जो रंग बनाए हैं, q.Tail लिए q.Head और q.Tail दोनों रंग अपना हैं ।

पूर्ण समाधान

नोट: यह समाधान दोनों quiver और quiver लिए काम करता है और कोड को बिल्कुल भी अनुकूलित करने की आवश्यकता नहीं है।

%// Create a quiver3 as we normally would (could also be 2D quiver)

x = 1:10;
y = 1:10;
[X,Y] = meshgrid(x, y);
Z = zeros(size(X));
U = zeros(size(X));
V = zeros(size(X));
W = sqrt(X.^2 + Y.^2);

q = quiver3(X, Y, Z, U, V, W);

%// Compute the magnitude of the vectors
mags = sqrt(sum(cat(2, q.UData(:), q.VData(:), ...
            reshape(q.WData, numel(q.UData), [])).^2, 2));

%// Get the current colormap
currentColormap = colormap(gca);

%// Now determine the color to make each arrow using a colormap
[~, ~, ind] = histcounts(mags, size(currentColormap, 1));

%// Now map this to a colormap to get RGB
cmap = uint8(ind2rgb(ind(:), currentColormap) * 255);
cmap(:,:,4) = 255;
cmap = permute(repmat(cmap, [1 3 1]), [2 1 3]);

%// We repeat each color 3 times (using 1:3 below) because each arrow has 3 vertices
set(q.Head, ...
    'ColorBinding', 'interpolated', ...
    'ColorData', reshape(cmap(1:3,:,:), [], 4).');   %'

%// We repeat each color 2 times (using 1:2 below) because each tail has 2 vertices
set(q.Tail, ...
    'ColorBinding', 'interpolated', ...
    'ColorData', reshape(cmap(1:2,:,:), [], 4).');

और एक 2 डी quiver वस्तु पर लागू होता है

यदि आप जरूरी नहीं है कि आप histcounts की पूरी सीमा तक तीरों को histcounts हैं तो आप कुल्हाड़ियों की रंग सीमाओं का उपयोग करके परिमाण को मैप करने के लिए histcounts (ऊपर की पंक्ति के बजाय) को निम्न कॉल का उपयोग कर सकते हैं।

clims = num2cell(get(gca, 'clim'));
[~, ~, ind] = histcounts(mags, linspace(clims{:}, size(currentColormap, 1)));

मैं प्रत्येक तीर के परिमाण के अनुरूप करने के लिए MATLAB से एक quiver3 प्लॉट में प्रत्येक तीर का रंग चाहता हूं। क्या उसे करने का कोई तरीका है?

मैंने कुछ उदाहरण ऑनलाइन देखे जो 2 डी quiver लिए ऐसा करने में सक्षम हैं, हालांकि उनमें से कोई भी 3 डी संस्करण, quiver3 3 के लिए काम नहीं quiver3

मेरे पास निम्नलिखित कथानक हैं और नीले तीरों को उनके परिमाण के अनुरूप रंग से बदलना चाहते हैं।


यदि आपकी पोस्ट r2014b संस्करण का उपयोग कर रही है, तो आप प्रत्येक लाइन और सिर का रंग बदलने के लिए अनिर्दिष्ट सुविधाओं का उपयोग कर सकते हैं:

figure
[x,y] = meshgrid(-2:.5:2,-1:.5:1);
z = x .* exp(-x.^2 - y.^2);
[u,v,w] = surfnorm(x,y,z);
h=quiver3(x,y,z,u,v,w); 

s = size(x);
nPoints = s(1)*s(2);
% create a colour map
cmap = parula(nPoints);
% x2 because each point has 2 points, a start and an end.
cd = uint8(repmat([255 0 0 255]', 1, nPoints*2));
count = 0;
% we need to assign a colour per point
for ii=1:nPoints
  % and we need to assign a colour to the start and end of the 
  %   line.
  for jj=1:2
    count = count + 1;
    cd(1:3,count) = uint8(255*cmap(ii,:)');
  end
end
% set the colour binding method and the colour data of the tail
set(h.Tail, 'ColorBinding','interpolated', 'ColorData',cd)

% create a color matrix for the heads
cd = uint8(repmat([255 0 0 255]', 1, nPoints*3));
count = 0;
% we need to assign a colour per point
for ii=1:nPoints
  % and we need to assign a colour to the all the points 
  %   at the head of the arrow
  for jj=1:3
    count = count + 1;
    cd(1:3,count) = uint8(255*cmap(ii,:)');
  end
end
% set the colour binding method and the colour data of the head
set(h.Head, 'ColorBinding','interpolated', 'ColorData',cd)

नोट: मैंने परिमाण के साथ कुछ भी चतुर नहीं किया है और मूल मैट्रिक्स में क्रम के आधार पर प्रत्येक तरकश का रंग बदल दिया है - लेकिन आपको इस "सुविधा" का उपयोग करने के बारे में विचार करने में सक्षम होना चाहिए