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,今天就先整理这么多吧,滚床单去撒~~

 
 

posted on 2013-05-17 00:25  LitLeo  阅读(885)  评论(1编辑  收藏  举报

导航