我想显示用于生成每条曲线旁边的每条曲线的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
答案 0 :(得分:2)
答案 1 :(得分:1)
首先,您是否需要同时绘制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));
最后,最好在Matlab脚本的顶部加入clear all
。
编辑:要让每个绘制的线条为循环的每次迭代使用不同的颜色,请使用以下内容
... 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