MATLAB - Маркировка кривых во время итерации - PullRequest
0 голосов
/ 05 декабря 2011

Я хочу показать значение p, которое использовалось для создания каждой кривой рядом с каждой из построенных кривых.Обратите внимание, что поскольку существует график E и -E, то же самое значение p должно быть рядом с обоими.Я пытался сделать это некоторое время, и я не нашел ничего сверхъестественного.

t = -3.1;%coupling
a = 1;%distance between r1 and r3
n = 5;%latice vector span in a1 direction
m = 1;%latice vector span in a2 direction
i = -7;%unique axial vector t_hat direction
j = 11;%unique axial vector c_hat direction

max_p = abs((n*(i+j/2)-j*(m+n/2)));%# of unique p values
La = sqrt(3)*sqrt(m^2+n*m+n^2)*a/gcd(2*n+m,2*m+n);%unit cell length
C = sqrt(n^2+n*m+m^2);%circumference of the nanotube

hold on;
for p=0:1:max_p
    kt = -pi/La:.05:pi/La;
    kc = 2*pi*p/C;
    ka1 = kc*a*.5*(2*n+m)/C + kt*a*sqrt(3)*.5*m/C;
    ka2 = kc*a*.5*(n+2*m)/C - kt*a*sqrt(3)*.5*n/C;
    E = abs(t+t*exp(1i*ka2)+t*exp(1i*ka1));

    title_ = sprintf('(%d,%d) Carbon Nanotube Dispersion Diagram',n,m);
    title(title_);
    xlabel('k_{t}a');
    ylabel('Energy (eV)');
    plot(kt,E);
    plot(kt,-E);
end

Ответы [ 2 ]

2 голосов
/ 05 декабря 2011

Существует команда с именем text, которая записывает комментарии на рисунки,

http://www.mathworks.se/help/techdoc/ref/text.html

с, если вы не можете решить это с помощью этой операции и строки, я неправильно понял вопрос

1 голос
/ 05 декабря 2011

Во-первых, вам нужно построить как E, так и -E? Так как они одинаковы, за исключением их знака, вы на самом деле не добавляете никакой информации в график, имея там также -E. Однако, если вам нужны обе строки, просто создайте массив строк для легенды, во время цикла, в котором каждая строка включена дважды (один раз для E и один раз для -E).

... Initial calculations ...

hold on;
for p=0:1:max_p
    kt = -pi/La:.05:pi/La;
    kc = 2*pi*p/C;
    ka1 = kc*a*.5*(2*n+m)/C + kt*a*sqrt(3)*.5*m/C;
    ka2 = kc*a*.5*(n+2*m)/C - kt*a*sqrt(3)*.5*n/C;
    E = abs(t+t*exp(1i*ka2)+t*exp(1i*ka1));

    plot(kt,E);
    plot(kt,-E);

    % Construct array containing legend text
    legend_text{2*(p+1)-1} = strcat('p=', num2str(p));
    legend_text{2*(p+1)}   = strcat('p=', num2str(p));

end

title_ = sprintf('(%d,%d) Carbon Nanotube Dispersion Diagram',n,m);
title(title_);
xlabel('k_{t}a');
ylabel('Energy (eV)');

legend(legend_text)

Я уверен, что есть более элегантный способ создания текста легенды, но приведенный выше код работает. Также обратите внимание, что я переместил вызовы на xlabel, ylabel и title за пределы цикла. Таким образом, они вызываются только один раз, а не для каждой итерации цикла.

Наконец, вы должны позаботиться о том, чтобы каждая итерация цикла отображала свой цвет линии или стиль линии (см. Правку ниже). Вы можете покрасить / стилизовать каждую пару строк E и -E одинаково для данной итерации цикла и просто отобразить легенду для E (или -E), что, очевидно, уменьшит вдвое количество записей легенды. , Для этого вам нужно будет скрыть видимость дескриптора линии - это не позволит ему получить элемент в легенде. Для этого используйте в своем цикле следующее:

plot(kt, E);
plot(kt,-E, 'HandleVisibility', 'off');

% Construct array containing legend text
legend_text{p+1} = strcat('p=', num2str(p));

Наконец, лучше всего включить clear all в начало ваших скриптов Matlab.

Редактировать: Чтобы каждая построенная линия использовала разные цвета для каждой итерации цикла, используйте что-то вроде следующего

... initial calculations ...

cmap = hsv(max_p);  % Create a max_p-by-3 set of colors from the HSV colormap

hold on;
for p = 0:1:max_p
  plot(kt,  E, 'Color', cmap(p,:));  % Plot each pair of lines with a different color
  plot(kt, -E, 'Color', cmap(p,:));
end
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...