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()函數固定坐標范圍,這樣所有圖像放一起就能比較差異了