2014-10-12 5 views
1

Я хочу создать круговую диаграмму, не используя команду 'pie' в matlab. Я как-то справился, но мне не удалось раскрасить сегменты. может кто-то помочь мне, как я могу сделать так: ниже мой код:Раскраска круговой диаграммы

function pie_chart 

r = 1; 
v = [10 15 20 25 30]; 

C = ['r' 'g' 'b' 'm' 'c']; 

t= 0:0.01:2*pi; 

x = r * cos(t); 
y = r * sin(t); 

plot(x,y, 'k');hold on 

for k=1:length(v) 

    t=[v/sum(v)*2*pi]; 

    for t=1:length(t) 

    x=[0 r *cos(t)]; 
    y=[0 r *sin(t)]; 

    plot(x,y); hold on 

    fill(x,y,'C'); 

    end 

    axis square 

    axis off 

end 
+0

in 'fill (x, y, 'C')' - ''C' 'не является цветом. Вы, наверное, хотели '' c'' или 'C (t)' – thewaywewalk

ответ

1

Были несколько ошибок в коде:

Когда вы объявляете C = ['r' 'g' 'b' 'm' 'c']; вы конкатенации строк между [], поэтому вы закончили с C='rgbmc'. Лучше объявить его как массив cell, используя фигурные скобки {}. Таким образом, ваша декларация становится следующей: C = {'r' 'g' 'b' 'm' 'c'};

Функция fill нуждается в закрытой области для заполнения. Вы отправляли только две координаты точки в функцию (так что в основном строка), поэтому она только окрашивала линию.

На самом деле, это было даже не окраска, потому что вы указывали 'C' как цвет. Вы должны отправить одну из строк, содержащихся в вашем массиве ячеек: C{k}

Наконец, вам не нужна двойная петля, достаточно одного цикла над вашим различным квадрантом (вы определяли t во внешнем цикле, затем сразу же переписывая его при объявлении второго цикла).

Следующий код производит цветную круговую диаграмму. Если вы не понимаете некоторые аспекты, я предлагаю вам запустить его по очереди и посмотреть содержимое переменной в рабочей области.

function pie_chart 

% Define quadrants and color 
r = 1; 
v = [10 15 20 25 30]; 
C = {'r' 'g' 'b' 'm' 'c'}; 

theta = linspace(0,2*pi,359) ; 
idx_spokes = round([1 cumsum(v)/100*length(theta) ]) ; %// find the indices of the spokes 

for k=1:length(idx_spokes)-1 

    t = theta(idx_spokes(k):idx_spokes(k+1)) ; 

    x=[0 r*cos(t) 0]; 
    y=[0 r*sin(t) 0]; 
    plot(x,y); hold on 
    fill(x,y, C{k}); 
end 

axis square 
axis off 
+0

так благодарны. Радуйся за свои усилия. Я вижу, где я все ошибаюсь. – Jesuit

+0

@ Если вы ответите на этот вопрос, пожалуйста, подумайте о том, чтобы «принять» его, щелкнув значок «V» рядом с ним. – Shai

Смежные вопросы