今天早上刚讲完课,一个小时的培训准备起来也很不容易呐,但是讲完还是挺开心的啦。
现在来把绘图篇更新一下。
这篇主要就讲matlab数据可视化,介绍一下matlab基本图形绘制。
绘图篇
数据导入
给大家解释一下数据文件,beijing_siteinfo.csv给出了北京12个国控站的站点信息。beijing_pm2_5___Jan.nc给出了-5年1月份PM2.5数据。
数据仅matlab教学使用哈,可以到资源里下:/download/qq_27984679/15597542
没办法,博客没办法直接添加附件,太不方便了。
clc;clear;%close all;bjinfo=importdata('../data/beijing_siteinfo.csv') %读入csv文件中站点信息textinfo=bjinfo.textdata %读入csv文件中站点文本信息datainfo=bjinfo.data %读入csv文件中站点数据信息bjinfo=readmatrix('../data/beijing_siteinfo.csv') %其他方法读入csv文件数据信息
pm2_5=ncread('../data/beijing_pm2_5___Jan.nc','pm2_5'); %读入PM2.5数据lat=ncread('../data/beijing_pm2_5___Jan.nc','lat'); %读入纬度数据lon=ncread('../data/beijing_pm2_5___Jan.nc','lon'); %读入经度数据siteid=ncread('../data/beijing_pm2_5___Jan.nc','siteid'); %读入站点数据ind=find(pm2_5==-999);pm2_5(ind)=nan; %将缺省值-999替换为NaN
数据可视化
折线图(plot)
task1: 画出第1~4个站点1月PM2.5的逐小时时间序列;
四条线分别为红色,蓝色,粉色,绿色;
线型为实线,线宽为2;
给出图例,x,y轴标签,标题;
pm25_m1=reshape(pm2_5(:,:,1,:),744,12);color=['r','b','m','g'];figurefor i=1:4plot(pm25_m1(:,i),'color',color(i),'linewidth',2);hold on %画出折线图end%legend({'site1','site2','site3','site4'}) %给出图例legend(textinfo(1:4,2)) xlabel('hours') %给出x轴标签ylabel('PM_{2.5}') %给出y轴标签title(' Jan PM_{2.5} concentrations') %给出标题
散点图(scatter)
task2: 比较第1~4个站点1月PM2.5浓度;
散点实心,大小25;
画出1:1线,线型实线,线宽2,红色;
x=1:600;y=x;sz = 25; %设置散点大小c = linspace(1,10,length(pm25_m1(:,1)));figurescatter(pm25_m1(:,1),pm25_m1(:,2),sz,c,'filled');hold on %画出散点图plot(x,y,'r-','linewidth',2);hold on
饼图(pie)
task3: 统计第1~4个站点1月PM2.5浓度优良差天数占比;
优良差定义:(这个定义仅是这里示例用的哈)
优:浓度低于等于35;
良:浓度大于35且小于等于75;
差:浓度大于75;
画出爆炸效果饼图;
for i=1:4figureid1=find(pm25_m1(:,i)<=35);id2=find(pm25_m1(:,i)>35&pm25_m1(:,1)<=75);id3=find(pm25_m1(:,i)>75);num1=numel(id1);num2=numel(id2);num3=numel(id3);num=[num1,num2,num3];label={'优','良','差'}explode=[0,0,0.5]; %设置爆炸效果圆心距离%pie(num) %饼图+百分比标签%pie(num,label) %饼图+文本标签pie(num,explode,label) %爆炸效果饼图end
合成文本和百分比标签
p=pie(num);pText = findobj(p,'Type','text');percentValues = get(pText,'String');txt = {'优: ';'良: ';'差: '};combinedtxt = strcat(txt,percentValues);pText(1).String = combinedtxt(1);pText(2).String = combinedtxt(2);pText(3).String = combinedtxt(3);
柱状图 (bar)
task4: 统计第1~4个站点1月PM2.5浓度优良差天数占比;
bar(num) %画出柱状图
柱状图的作用和饼图类似,但如果分类较多,适合用柱状图,否则饼图每个扇形太小就会看不清楚。
直方图 (histogram)
task5: 给出第1个站点1月PM2.5浓度频数分布和频率分布;
x轴范围限制在[0,300];
figurehistogram(pm25_m1(:,1))%xlim([0,300])figurehistogram(pm25_m1(:,1),'normalization','pdf') %画出频率分布直方图%xlim([0,300])
如果把‘normalization’后面的参数pdf改成count,那画出来的也是频数分布直方图。
这里左边是频数分布直方图,右边是频率分布直方图。
直方图和柱状图的区别在于,直方图一般x轴是连续的,适合数值型数据;而柱状图是分隔的,适合分类型数据。
箱线图(boxplot)
task6: 比较12个站点1月PM2.5浓度的各个统计量(最大最小值、中位数等);
boxplot(pm25_m1)
箱线图适合一组数据多种统计量的比较,我这里就是比较了12个站点1月的PM2.5。
箱子的上边缘Q3和下边缘Q1分别是下四分位数和上四分位数;
四分位距IQR=Q3-Q1;
上限=(Q3+1.5IQR,max)取最小,
下限=(Q1-1.5IQR ,min)取最大。
关于箱线图怎么看可以参考这篇博客,这里面有张图非常清楚:/weixin_39980917/article/details/111579740?utm_medium=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-1.baidujs&dist_request_id=1328603.1454.16148714256221063&depth_1-utm_source=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-1.baidujs
三维图 (surf)
task7: 画出全球地面高度,z轴表示高度
height=double(ncread('../data/global_surface_height.nc','height')); %从文件读取数据,第一个参数为文件名,第二个参数为变量名lat=double(ncread('../data/global_surface_height.nc','lat'));lon=double(ncread('../data/global_surface_height.nc','lon'));[cnlat,cnlon]=meshgrid(lat,lon);figuresurf(cnlon,cnlat,height) %画出高度分布三维图%set(gca,'ZDir','reverse'); %调换z轴正负方向
地图
task8: 画出全球地面高度,颜色表示高度
figurepcolor(cnlon,cnlat,height);shading flat %画出高度分布地图colorbarcaxis([0,6000])hold onload ../data/mask1x1.mat %读入海岸线文件mask_lon=lon;mask_lat=lat;[mask_lon1,mask_lat1]=meshgrid(mask_lon,mask_lat);contour(mask_lon1,mask_lat1,mask,'k'); %给地图加上海岸线hold onset(gca,'FontSize',18)xlabel('lon','fontweight','bold','FontSize',22);ylabel('lat','fontweight','bold','FontSize',22);
那这里pcolor画的地图是非常粗糙的,如果大家想用matlab画好看的地图,建议下载m_map包来进行图形绘制:https://www.eoas.ubc.ca/~rich/map.html
那这些就是一些最最基本的matlab画图,更多的技巧和设置大家自行doc官方文档或者百度探索吧~
讲座完事儿了,也不知道有没有动力再更新进阶篇,哈哈哈,想偷懒啦。就随缘更新吧~
科研干饭人加油!
如果觉得《matlab笔记——绘图篇——折线图+散点图+饼图+直方图+柱状图+箱线图+三维图+地图》对你有帮助,请点赞、收藏,并留下你的观点哦!