最近看到有人问下面的图应该怎么画。最简单的方法是使用Origin,Origin也可以很容易实现上述的功能,绘图教程:http://www.cappchem.com/Article2014/1108.html。
但是,目前笔者在Matlab中尚未找到现成的相关的绘图方法供我们使用,如果看到这里的某位看官知道Matlab简单的方法,希望不吝赐教,在评论区留言给笔者。这里只是介绍一种通过Matlab代码的方式如何实现。 首先,我们以一个简单的实例开始,假设我们需要画的是下面的一个三维图,和一般的三维散点图不同的是YOZ平面的散点使用折线连接在了一起。
data=textread('F:/时段.txt');
data=data(:,1:end-1);
car_num = size(data,1);
day_num = size(data,2);
hour_num = 3;
for i=1:car_num%车序号
%每辆车一条曲线
count = 1;
u = [];
for j=1:day_num%天序号
u(count,1) = i;
u(count,2) = j;
u(count,3) = data(i,j);
count = count + 1;
end
%绘制每辆车的曲线
x=u(:,1);%车
y=u(:,2);%天
z=u(:,3);%时段
plot3(x,y,z,'bo',x,y,z);
grid on;
hold on;
axis([0, car_num+1,0,day_num,0,hour_num]);% 坐标轴的显示范围
set(gca, 'XTick', 0:car_num+1); % 车
set(gca, 'YTick', 0:day_num); % 天
set(gca, 'ZTick', 0:hour_num); % 时段
end
xlabel('车');
ylabel('天');
zlabel('时段');
title('折线图');
3 3 2 0 0 0 0 1 3 1 3 0 0 0 0 3 1 3 0 0 0 0 1 0 0 0 0 2 2 2
1 0 1 2 0 0 0 0 1 3 1 0 0 0 0 2 2 1 0 0 0 0 1 1 1 0 0 0 0 3
1 3 3 1 0 0 0 0 0 1 0 0 0 0 1 2 1 3 0 0 0 0 3 1 2 0 0 0 0 2
2 0 0 0 0 1 2 3 3 0 0 0 0 3 2 3 0 0 0 0 2 3 2 0 0 0 0 2 1 2
0 3 1 3 0 0 0 0 0 3 2 0 0 0 0 0 2 1 2 0 0 0 0 0 3 3 1 3 0 0
0 0 3 2 3 2 0 0 0 0 1 3 3 2 0 0 0 0 3 0 3 0 0 0 0 2 1 3 2 0
2 2 2 0 0 0 0 2 1 2 2 0 0 0 0 0 2 1 2 2 0 0 0 0 2 1 0 2 0 0
1 0 0 0 0 1 1 1 2 0 0 0 0 3 2 2 1 0 0 0 0 3 1 3 3 0 0 0 0 1
2 0 0 0 0 3 3 1 3 0 0 0 0 2 2 0 0 0 0 0 3 3 2 0 0 0 0 2 1 2
0 0 0 2 0 1 3 0 0 0 0 0 3 1 1 3 0 0 0 0 1 2 1 0 0 0 0 3 1 3
3 0 0 3 0 0 0 0 3 1 2 3 0 0 0 0 2 2 0 1 0 0 0 0 2 1 3 0 0 0
3 2 2 3 0 0 0 0 2 2 2 0 0 0 0 1 1 1 0 0 0 0 3 3 2 0 0 0 0 1
0 0 0 0 2 2 3 2 0 0 0 0 1 3 3 0 0 0 0 1 2 2 0 0 0 0 3 0 2 3
3 0 2 0 0 0 0 2 3 3 2 0 0 0 0 1 2 3 0 0 0 0 2 2 1 1 0 0 0 0
0 0 0 0 3 3 3 1 0 0 0 0 2 1 0 0 0 0 0 3 1 1 0 0 0 0 1 0 2 3
3 0 2 0 0 0 0 3 2 2 1 0 0 0 0 1 2 2 1 0 0 0 0 2 3 3 3 0 0 0
0 0 1 2 0 0 0 0 2 3 2 0 0 0 0 0 3 3 0 0 0 0 0 1 0 0 0 0 3 3
1 0 3 1 0 0 0 0 2 1 1 0 0 0 0 1 1 2 0 0 0 0 1 2 2 1 0 0 0 0
0 0 1 1 2 0 0 0 0 3 2 0 1 0 0 0 0 3 1 1 3 0 0 0 0 0 0 3 3 1
1 2 0 0 0 0 1 3 3 2 0 0 0 0 3 2 3 1 0 0 0 0 0 3 2 3 1 0 0 0
2 1 2 3 0 0 0 0 1 2 1 0 0 0 0 0 3 1 1 0 0 0 0 3 1 1 2 0 0 0
0 0 1 1 1 0 0 0 0 1 2 0 3 0 0 0 0 1 0 3 3 0 0 0 0 3 3 3 3 0
0 0 0 0 2 1 1 1 0 0 0 0 3 3 3 0 0 0 0 0 1 3 3 2 0 0 0 0 2 3
0 0 1 2 1 3 0 0 0 0 1 2 3 2 0 0 0 0 1 0 2 2 0 0 0 0 1 1 2 1
0 0 0 0 2 3 3 3 0 0 0 0 1 1 3 2 0 0 0 0 1 2 3 3 0 0 0 0 3 1
0 0 0 0 0 0 0 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2 0 0 0 0 0 0 0
3 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 1 0
0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 2 0 0 0 0 0 0 0 0 0
0 0 0 0 0 3 0 1 2 0 0 0 0 1 3 0 0 0 0 0 3 0 0 0 0 0 0 3 0 1
0 0 1 0 0 0 0 0 0 0 0 3 0 0 0 0 0 0 1 0 0 0 0 2 0 0 0 0 2 2
2 0 0 3 0 0 0 0 0 3 0 0 1 0 0 0 0 0 2 0 0 0 0 0 2 0 0 0 0 0
0 1 0 0 0 0 0 3 0 0 0 0 0 0 0 0 1 0 0 0 0 1 3 0 3 0 0 0 0 1
0 0 3 2 0 0 0 0 2 0 0 0 0 0 0 3 0 0 0 0 1 0 3 0 0 0 0 3 2 0
0 0 0 1 0 1 0 0 0 0 0 0 2 0 2 0 0 0 0 0 0 0 0 1 0 0 0 0 0 2
0 0 0 0 1 0 0 2 0 0 0 0 3 3 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0
0 0 0 3 0 0 0 0 1 0 0 1 0 0 0 0 0 1 2 0 2 0 0 0 0 3 0 0 3 0
3 1 1 0 0 0 0 3 0 0 0 0 2 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0
0 0 0 0 0 0 0 2 0 1 0 0 0 0 2 0 0 0 0 0 0 0 0 0 1 0 0 2 0 0
0 0 0 2 2 0 0 0 0 3 3 1 0 0 0 0 1 2 3 1 0 0 0 0 0 2 1 3 0 0
0 2 0 1 3 0 0 0 0 0 0 0 1 2 0 0 0 0 2 1 3 0 0 0 0 0 0 0 0 3
0 0 1 0 0 0 0 1 0 0 0 0 0 0 0 0 1 1 0 3 0 0 0 0 0 2 3 0 2 0
0 0 0 0 0 0 0 2 1 0 0 0 0 0 0 0 0 0 0 2 1 0 0 0 0 0 0 1 0 1
3 0 0 0 0 1 0 3 2 0 0 0 0 0 0 0 2 3 0 0 0 0 3 1 0 1 0 0 0 0
0 0 3 0 0 1 0 0 0 0 0 0 0 3 0 0 1 0 0 0 0 1 2 2 3 0 0 0 0 0
0 0 3 1 2 0 0 0 0 1 0 3 0 0 0 0 0 1 0 0 0 0 2 0 3 1 0 0 0 0
2 0 0 2 0 0 0 0 0 0 0 0 2 2 2 0 0 0 0 0 0 0 1 1 0 2 0 0 0 0
0 1 0 0 0 0 0 1 1 3 0 0 0 0 0 3 0 3 0 0 0 0 0 2 3 2 0 0 0 0
0 0 0 0 0 3 0 3 0 0 0 0 0 0 0 0 1 0 2 0 0 0 0 0 2 3 0 2 0 0
3 0 3 0 0 0 0 1 0 0 0 0 3 3 0 0 0 0 1 1 0 0 0 0 1 1 0 1 0 0
0 0 0 1 0 0 0 0 0 0 0 0 2 0 0 0 0 2 0 3 0 0 0 0 2 0 0 0 0 2
0 0 0 1 0 0 0 0 2 0 0 0 0 0 2 0 3 2 0 0 0 0 0 0 2 2 3 0 0 0
0 0 0 2 1 1 0 0 0 0 0 2 0 0 0 0 2 0 0 0 0 0 3 1 2 1 0 0 0 0
0 0 1 2 1 2 0 0 0 0 0 0 1 1 3 3 0 0 0 0 3 0 0 0 0 1 0 0 2 0
0 0 0 3 0 0 0 0 1 3 0 0 0 0 0 0 1 1 0 0 0 0 2 0 0 0 0 1 0 3
0 0 0 1 0 0 0 0 0 3 0 0 2 0 0 0 0 3 0 0 0 0 1 2 0 2 0 0 0 0
其中,数据共55行,每一行数据代表一辆车的信息,该行中的第i列代表该车的第i天的状态,例如第一行,第一列中的3代表,第一辆车在第一天的第三个时段出行。
有了上面的基础,是不是就可以绘制类似于下面的图了?其实和下图相比,上图只要YOZ平面上有足够多的的点,同时,X值的个数再少一点,就可以达到下述的效果。
如果你还想添加一个网格,那么可以这样,以下内容参考自Matlab官网提供的示例。
[Y,Z] = meshgrid(1:0.5:10,1:20);
X = zeros(size(X));
surf(X,Y,Z)