2012-10-27 24 views
1

我想知道是否有一種簡單的方法來使用修補程序命令更改Voronoi圖的顏色。事實上,似乎必須有一種相對簡單的方法,因爲我使用set命令來更改顏色條的限制,以便在繪製不同的Voronoi圖時對顏色進行標準化。Voronoi Diagrams改變顏色

for i = 1:length(p) 
if all(p{i}~=1) % If at least one of the indices is 1, 
        % then it is an open region and we can't 
        % patch that. 
patch(v(p{i},1),v(p{i},2),log10(Color(i)))**; % use color i. 
set(gca, 'CLim', [0 7]); 
colorbar 
end 
end 

patch命令用於從voronoin命令中獲取輸出信息,然後創建凸多邊形的面。重要的部分是這些補丁的着色。正如你所看到的那樣,這是我傳入patch命令的第三個輸入參數,並且是一個mx1值的向量。

我的問題是,是否可以使用補丁創建那些初始顏色映射到這些多邊形上的多邊形,然後能夠使用set命令(或類似的東西)來輸入另一個mx1顏色矢量使用初始着色的原始映射,一次更改所有這些多邊形的顏色。

我之前做的方式是非常耗時的方法。因爲每種顏色都必須與其特定的多邊形相對應,所以每當我想要一種新顏色時,我都必須重新創建所有多邊形。我希望在創建多邊形之後,使用新的顏色矢量更改顏色更簡單。

讓我知道是否有什麼我可以做,使這更清楚,謝謝!

回答

1

我不能完全確定這是否是你所要求的,但也可能是:

% Is this how you generate your Voronoi diagram? 
x = gallery('uniformdata',[1 10],0); 
y = gallery('uniformdata',[1 10],1); 
dt = DelaunayTri(x(:),y(:)); 
v = voronoiDiagram(dt); 

% Original colors of your Voronoi patches (mx3 matrix) 
origColors = rand(numel(p), 3); 

% To store handles to the generated patches 
pHandle = nan(1, numel(p)); 

for i = 1:numel(p) 
    if all(p{i}~=1) 
     pHandle(i) = patch(v(p{i},1), v(p{i},2), colors(i)); 
    end 
end 
set(gca, 'CLim', [0 7]); 

% New colors for the patches (mx3 matrix) 
newColors = rand(numel(p), 3); 

% Recolor the closed regions 
closedIdx = find(~isnan(patchHandle)); 
arrayfun(@(i) set(pHandle(i), 'FaceColor', colors(i,:)), closedIdx); 
set(gca, 'CLim', [0 7]); 
+0

非常感謝此評論。這與我所需要的非常接近。我修改了你的代碼只是爲了得到我在另一個答案中發佈的內容 – Tim

1
x = [3 6 9 1 2 10 2 2 5 8]'; 
y = [5 10 15 3 5 12 5 8 10 7]'; 

[v,p] = voronoin([x,y]); 

% Original colors of your Voronoi patches (mx3 matrix) 
colors = [10 9 NaN NaN 2 NaN NaN 1 NaN NaN]'; 

% To store handles to the generated patches 
pHandle = nan(1, numel(p)); 

for i = 1:numel(p) 
if all(p{i}~=1) 
    pHandle(i) = patch(v(p{i},1), v(p{i},2), colors(i)); 
end 
end 
colorbar 
% New colors for the patches (mx3 matrix) 
colors = [1 2 NaN NaN 9 NaN NaN 10 NaN NaN]'; 

% Recolor the closed regions 
closedIdx = find(~isnan(pHandle)); 
arrayfun(@(i) set(pHandle(i), 'FaceColor','flat','FaceVertexCData',colors(i,:),'CDataMapping','scaled'),closedIdx); 

我不得不使用NaN的爲熄滅到無窮大,並且不限定的補丁,所以那些有界的,我可以給它們着色。謝謝您的幫助!

+0

好的答案@Tim。你的問題可能以某種方式與我的相關,所以我想試試我的機會邀請你參加我的問題,並希望能夠找到我的答案,如果你知道的話。我的問題鏈接是: http://stackoverflow.com/q/40932015/2751916 和我一直很高興,如果你能幫助它(我知道這個問題是4年前,但我會嘗試我的機會)。提前致謝。 –