2013年东三省数模A题第一问-(Matlab绘制折线图、饼状图)
最近参加了东三省的数模竞赛,怎么说呢==怎一个坑爹了得。不过最后还是挣扎的把论文交上去了。因为我在数模中主要负责写代码的部分,正赶上最近有点时间,所以整理一下数模中学到的东西,也算对自己知识的一个梳理。PS:只是一些基本的知识和一些以前大家就碰到过的问题,希望大家不要吐槽。
首先是背景:
比赛:2013年东三省数模
所选题:A题(http://www.madio.net/thread-183416-1-1.html)
此题分析一下,大体可以归为大数据分析和数理统计的范畴。
下面是这道题的主要部分:
请下载2010年、2011年和2012年深圳市的食品抽检数据(注意蔬菜、鱼类、鸡鸭等抽检数据的获取),并根据这些资料来讨论:
1. 如何评价深圳市这三年各主要食品领域微生物、重金属、添加剂含量等安全情况的变化趋势;
2. 从这些数据中能否找出某些规律性的东西:如食品产地与食品质量的关系;食品销售地点(即抽检地点)与食品质量的关系;季节因素等等;
3. 能否改进食品抽检的办法,使之更科学更有效地反映食品质量状况且不过分增加监管成本(食品抽检是需要费用的),例如对于抽检结果稳定且抽检频次过高的食品领域该作怎样的调整?
(下载数据后一共有一百九十多个excel和word表格==坑爹啊)
第一题就很坑爹,一个看似很简单的题目,确是最坑爹的题目,思路很简单,就是按年份统计分类,问题是数据量大啊==怎么办。。发扬吃苦耐劳精神,干呗。
统计完数据后,根据总数据绘制折线图,根据污染物绘制饼状图。不多说,直接上代码,代码中有注释:
%这是折线图的代码 clear all; %三年的数据 h_metal = [0.004160888 0 0.002053388 0.009210526 0.001730104 0.029742234 0.001589825 0.005432099 0.003926702 0.001432254 0 0 0.000789266 0.005124451 0.000937647 0.00426916 0.00426916]; microbe = [0.016643551 0.008429119 0.016427105 0.039473684 0.029411765 0.043621943 0.018282989 0.007901235 0.028795812 0.017187052 0.002024291 0.002922078 0.016574586 0.005124451 0.005625879 0.018296402 0.018296402]; additive = [0.030513176 0.004597701 0.008213552 0.022368421 0.012687428 0.04494382 0.032591415 0.007901235 0.016361257 0.008307075 0.000674764 0.006168831 0.009471192 0.00329429 0.003750586 0.003252694 0.003252694]; others = [0.06518724 0.002298851 0 0.040789474 0.009803922 0.009473452 0.016693164 0.019259259 0.018979058 0.010025781 0 0 0 0 0 0 0]; %转化成千分比 h_metal = h_metal * 100; microbe = microbe * 100; additive = additive * 100; others = others * 100; %三年,一共16个数据,2010年6个,2011年5个, 2012年5个 x = 1 : 17; x=x'; %plot(x,a, %'k-o', 黑色 实线 空心圆 %'linewidth',2,' 线宽 %markersize',4); 标记点大小 plot(x,h_metal,'r-s','linewidth',1.5,'markersize',2.5); %在同一副图上绘制四条曲线 hold on plot(x,microbe,'k-s','linewidth',1.5,'markersize',2.5); plot(x,additive,'b-s','linewidth',1.5,'markersize',2.5); plot(x,others,'g-s','linewidth',1.5,'markersize',2.5); hold off axis ([1 17 -1 10]); %对坐标轴进行设置 ,这点是需要注意的,点的数量要特别注意 set (gca,'xtick',[1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17]); set (gca,'xticklabel',{'2010' '' '' '' '' '2011' '' '' '' '' '2012' '' '' '' '' '' '2013 (年)'}); set (gca,'ytick',[-1 0 1 2 3 4 5 6 7 8 9 10 ]); set (gca, 'yticklabel', {'' '0' '1' '2' '3' '4' '5' '6' '7' '8' '9' '(%)' }); set(gca,'FontSize',12, 'FontName','标楷体'); ylabel('千分比','fontname','标楷体','fontweight','bold','fontsize',12); %坐标轴标题 xlabel('时间','fontname','标楷体','fontweight','bold','fontsize',12); %text(1,58,'(a)','Fontweight','bold','fontsize',12) ; %文本框标注 添加三年的文本框标注 box off; % plot(x,ma,'k--','linewidth',2); legend 重金属 微生物 添加剂 其他 ; %图例 %legend('boxoff'); set(legend,'fontname','标楷体'); set(legend,'fontweight','bold');
然后是绘制饼状图的代码:
1 %2010添加剂 2 3 Names={'米面制品:';'休闲零食:';'糕点点心:';'熟肉制品:';... 4 5 '动物性水产品:';'干货:';'调味料:';'饮料:';'酒:'; '餐饮用具:'}; 6 7 data=[4 3 13 4 1 1 1 1 3 4]; 8 9 10 %食品种类总数 11 sum = 35; 12 13 data = data / sum; 14 %画饼状图 15 h =pie(data); 16 %下面部分是从网上抄的,具体功能是在饼状图上在各百分比处加上文字 17 colormap jet 18 19 textObjs = findobj(h,'Type','text'); 20 21 oldStr = get(textObjs,{'String'}); 22 23 val = get(textObjs,{'Extent'}); 24 25 oldExt = cat(1,val{:}); 26 27 newStr = strcat(Names,oldStr);%在名称后面加上x% 28 29 set(textObjs,{'String'},newStr) 30 31 val1 = get(textObjs, {'Extent'}); 32 33 newExt=cat(1, val1{:}); 34 35 offset = sign(oldExt(:,1)).*(newExt(:,3)-oldExt(:,3))/2;%sign返回一个同型矩阵,如果值大于0,对应位置则为1;等于0,对应位置为0;小于0,对应位置为-1 36 37 pos = get(textObjs, {'Position'});%标识的坐标应该是(x,y,z)这种形式,pos是一个cell,其中每个cell是一个1*3的向量 38 39 textPos = cat(1, pos{:});%将cell转换成一个n*3的矩阵,其中n为数据点数 40 41 textPos(:,1) = textPos(:,1)+offset;%取第一列,即每个标识的横坐标 42 43 textPos(3,2)=textPos(3,2)-0.1; 44 45 textPos(7,2)=textPos(7,2)-0.1; 46 47 set(textObjs,{'Position'},num2cell(textPos,[3,2]))%将textPos转成每个元素都是1*3向量的cell---%num2cell将数转为cell,取cell的值,应该用{},如Names{1}
ok,今天就先整理这么多吧,滚床单去撒~~