首页 文章

使用matlab绘制图形

提问于
浏览
2

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

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

X 从45到90,变化为.5 Z 从.4到.95,变化为.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

我想绘制 XY 的2d图,颜色应根据 Z 变量进行更改 .

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情况here解释的,所以如果你愿意,你可以在那里开始 .

相关问题