2

我在使用 .dat 文件的数据绘制图表时遇到问题。有人可以帮我吗?

该文件保存为/My Documents/filename.dat并具有代表变量的三列数字XYZ

X从 45 到 Z90,0.5 的变化是从 0.4 到 0.95,0.05 的变化 Y是这两个变量的结果。)

示例:(.dat 文件中的一部分数据)

48.000000 -0.000010 0.400000
48.500000 -0.000004 0.400000
49.000000 0.000003 0.400000
49.500000 0.000010 0.400000
50.000000 0.000016 0.400000

我想绘制 和 的 2d 图XY颜色应根据Z变量而变化。

4

1 回答 1

4

使用textscan读取数据:

fid = fopen('/My Documents/filename.dat');
data = textscan(fid, '%f %f %f');
fclose(fid);
X=data{1};
Y=data{2};
Z=data{3};

绘图方法#1

然后,如果你用

plot(X,Y)

你会得到一个由线条组成的普通情节。然而,这些都具有相同的颜色。除非你把它们分成不同的行,否则改变它们是不可能的。

幸运的是,还有scatter函数可以让你这样做:

scatter(X,Y,[],Z)

这会绘制点,颜色基于 Z。

绘图方法#2

如果您希望这些点与也具有不同颜色的线连接,则必须将它们绘制为单独的线,并分别为每条线提供颜色:

plot([X(1:end-1)' ; X(2:end)'], [Y(1:end-1)' ; Y(2:end)']);

这些线条现在具有默认颜色,但是要获得正确的颜色有点麻烦,接下来是一个示例。不幸的是,我现在没有任何方法可以在这样的单行中输入颜色,所以我们必须循环。

Ncolors=10;
zmin=min(Z);zmax=max(Z);
dz=max((zmax-zmin)/Ncolors,eps);
clr_map=jet(Ncolors);
clr_ids=min(floor((Z(1:end-1)-zmin)/dz)+1,Ncolors);

figure;hold on;
for ii=1:numel(X)-1
    plot([X(ii) X(ii+1)], [Y(ii) Y(ii+1)],'color',clr_map(clr_ids(ii),:))
end

所有线条现在都具有基于其端点之一的颜色。

要添加colorbar,请使用colorbar,很奇怪吧?但当然,该条的标签指的是colororder。幸运的是,我们可以更改它们:

colormap(clr_map);
h_cb=colorbar;
set(h_cb,'yticklabel',arrayfun(@num2str,linspace(zmin,zmax,numel(get(h_cb,'ytick'))),'uni',false));

更改Ncolors以使用更多/更少的分辨率为线条着色。
可能矫枉过正:您还可以更改颜色栏上的标签数量,以下将其更改为 10:

colormap(clr_map);
h_cb=colorbar;
set(h_cb,'ytick',linspace(1,Ncolors,10));
set(h_cb,'yticklabel',arrayfun(@num2str,linspace(zmin,zmax,10),'uni',false));

或者现在标签只有 2 位小数:

set(h_cb,'yticklabel',arrayfun(@(yi) sprintf('%.2g',yi),linspace(zmin,zmax,10),'uni',false));

绘图方法#3

最后一种方法是使用补丁(速度较慢),此处针对 3d 案例进行了说明,因此您可以根据需要从那里开始。

于 2012-08-20T10:15:37.767 回答