author:ZKe
-------------------------------
以下是一个txt文件,每行11个字段,第一个字段是日期,后面10个是用户id和对应今天发表微博数,所有字段用制表符\'\t\'分隔
我们要对每一行数据,画一个柱状图,标题是日期,x轴是用户id,纵轴是发表微博数
而且是批量的,写一个Matlab脚本,绘制并保存每个图
1. 首先要处理每一行数据,进行字符串切割,假设str是我们读取的一行数据
parts = strsplit(str, \'\t\'); % 字符串切割,返回元胞数组 name = parts(1); % 第一个字段是日期 data = zeros(1,10); labels = cell(1,10); % 横坐标标记 subParts = cell(1,2); for i=1:length(parts)-1 subParts = strsplit(parts{i+1}, \':\'); % 对每一个id-count字段再切割 data(i) = str2double(subParts{2}); % 字符串转换为数值 labels{i} = subParts{1}; % {}访问元胞数组,和原类型一样是字符串 end
2. 然后通过所得数据绘制图形
fg = figure() % fg是可以保存的绘图句柄 axes1 = axes(\'Parent\',fg); % 通过axes修改横坐标标记 bar(data, \'FaceColor\',[0.73 0.83 0.96]) % 为柱状图添加数值标记 for i=1:10 text(i-0.1, data(i)+1.2, num2str(data(i))); end set(axes1,\'XTickLabel\',labels); % 横坐标标记修改为用户ID xlabel(\'用户ID\') ylabel(\'今日发微博数\') % 年月日字符串作为标题 datePart = strsplit(name{1},\'/\'); dateStr = strcat(datePart{1},\'年\',datePart{2},\'月\',datePart{3},\'日\') titleName = strcat(dateStr, \' 的发微博数Top10\'); title(titleName)
3. 保存图像
saveas(fg, strcat(\'发微博数Top10/\',titleName, \'.jpg\'));
close(fg) % 当前图像绘制完之后关闭当前图像,否则下一个循环再打开一个画布,批量很多张的话屏幕可能会崩
一张就是绘制一张图像的过程,要批量进行就要按行读取文件
在以上代码的上下添加如下代码即可:
str = \'\'; fid = fopen(\'srcdata.txt\'); % 打开一个文件 index = 0; while ~feof(fid) str = fgetl(fid); % 逐行读取 % 上述代码 end
效果如下!堪称Perfect!^_^ ~
不过这样其实还有一个缺陷,我忘记统一纵坐标范围了,可以用ylim()函数固定坐标范围,这样所有图像放一起就能比较差异了