用Matlab画随日期变化的折线图是常见操作了。但在画图的过程中,横坐标刻度往往是序号索引而不是对应日期。这次画降水折线图时又遇到了这个问题,如何将横坐标刻度修改成对应的时间?这次尝试的办法是先用日期对应的序号索引作为x轴进行画图,将要用到的日期单独存储为字符串数组。再用xticks设置刻度位置,用xticklabels更改对应的刻度值,核心代码如下。
plot(x, y,'-o','lineWidth',1.5,'color','#0072BD','MarkerSize',3,...
'MarkerEdgeColor','b',...
'MarkerFaceColor','b')
x1 = 1:6:length(x);
xticks(x1)
time1=time(1:6:end,:);
xticklabels(time1)
1996-2006年上海、广州两地月际降水量折线图
具体情况如下所示。有广州和上海两地1996-2006年的11年以来每月的降雨量数据,Year和Month分别是年月,Index是人为添加的索引号,在Excel里直接拉一下就行。
降水数据格式
首先利用下面的代码,在Matlab中读取该txt文件。把Year、Month利用strcat函数串联起来,得到格式如“1996.9”的字符串数组time,此时time的数据类型是132×7的char数组。x是132×1的double数组,即上图第三列里的Index。
file = 'rain_data.txt';
data = readmatrix(file);
year=data(:,1);
month=data(:,2);
x=data(:,3);
y = data(:, 4);
z = data(:, 5);
time=strcat(num2str(year),'.',num2str(month));
读取完之后就可以用plot画图了。因为刻度太多会挤在一起不美观,所以设置了步长为6,也即每隔6个月做一次刻度。x1用于规定在哪里画刻度,time1用于从time中提取出对应的刻度值,用xticklabels替换坐标区原有的刻度值。
plot(x, y,'-o','lineWidth',1.5,'color','#0072BD','MarkerSize',3,...
'MarkerEdgeColor','b',...
'MarkerFaceColor','b')
hold on
plot(x, z,'-o','lineWidth',1.5,'MarkerSize',3,...
'MarkerEdgeColor','r',...
'MarkerFaceColor','r')
x1 = 1:6:length(x);
xticks(x1)
time1=time(1:6:end,:);
xticklabels(time1)
xlabel('Month')
ylabel('Rainfall(mm)')
legend('Shanghai','Guangzhou')
title('Changes in Monthly Precipitation in Guangzhou and Shanghai from 1996 to 2006')
hold off
最后就能得到文章开头放的那张1996-2006年广州、上海两地降雨量分布图了。这个方法还是比较简单的,但是需要手动创建索引,对于数据量较大的情况还是比较麻烦。不过能满足现有需求还是不错的,有更好的办法以后遇到了再更新~