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

     
     
  • 相关阅读:
    asp.net mvc让我告诉你请求从哪里来
    我也要学iOS逆向工程--函数
    我也要学iOS逆向工程--全局变量
    我也要学C语言-第十九章:命令行参数
    使用docker搭建nfs实现容器间共享文件
    Golang控制goroutine的启动与关闭
    我是如何用Go语言搭建自己的博客的
    让我们一起Go(十三)
    让我们一起Go(十二)
    让我们一起Go(十一)
  • 原文地址:https://www.cnblogs.com/LitLeo/p/Matlab.html
Copyright © 2020-2023  润新知