上次赶课程作业,卡在matlab怎么画散点图这件事上,对着空白脚本折腾了快一个小时,一开始连基础绘图函数都没找对,还错用成plot,出来的全是连在一起的折线,完全不是想要的分散数据点。
当时手里有两组简单的实验数据,x是一组自变量,y是对应的测量值,本来只想把每个数据点单独展示出来,不带连线。最早敲代码的时候,直接写plot(x,y),运行之后线条把所有点串起来,反复改参数也消不掉那条线,那会还以为是数据格式出了问题,来回复制粘贴数组,来回清理工作区变量,白白耗掉不少时间。
后来才反应过来,画这种独立的数据点,要用scatter。最简单的写法就是scatter(x,y),x和y的元素数量得一模一样,不然直接报错,这个地方我踩过,x写了十个数字,y只填了九个,命令窗口直接抛出维度不匹配的提示,反复核对数组长度才解决。
可以在后面继续追加参数,调整点的大小、颜色,还有轮廓样式。scatter(x,y,50,'r'),50代表点的尺寸,r代表红色,数字调大,圆点就会变大,想换别的颜色,换成b、g这些字母就行。要是想给点加上黑色边框,再加一个设置填充的选项,就能区分开点的内部和边缘,论文图里经常这么调整。
这只是我的个人感受,不是标准答案,不同版本的软件,部分参数写法会有细微差别,版本旧一点的,有些额外的样式参数支持的不全。
还试过在图上加坐标轴标签,还有标题,单独写xlabel、ylabel、title三行代码,放在scatter语句后面,运行完图片上就带上标注。不加这些的话,图片本身只有一堆散点,交作业的时候会被打回,所以每次绘图,我都会顺手加上这几行。
有次想在同一张画布放两组散点,一组红色一组蓝色。一开始直接写两行scatter,结果后面那组图直接覆盖前面的,前面的点直接看不见。才想起holdon,在第一条绘图命令前面加上holdon,画完所有数据之后,末尾再加holdoff,这样多张绘图结果就叠加在一张图里,不会互相覆盖。holdoff不能忘,不关掉这个状态,后面别的绘图脚本还会继续叠加旧图像,很容易混淆不同实验的图。
数组定义这块也简单,直接在脚本里写x=[1,2,3,4,5],y=[1.2,2.1,2.8,4.3,5.1],写完直接运行,就能生成图。数据量大的时候,也能从excel导入,我那次作业数据不多,就直接手动录入数组,省去读取文件的步骤,不用额外处理表格读取的bug。
图像生成之后,还能打开图窗,点里面的工具手动微调,拖动坐标轴范围,修改字体大小。不过我习惯尽量在代码里写好参数,每次重新运行脚本,出来的图都保持一致,不用每次手动调整图窗。手动改完的图不会保存在代码里,下次重新运行脚本,改动就全部消失,这点很麻烦。
代码写好之后,保存图片可以在图窗选择导出,保存成png或者eps格式。eps格式适合放进论文,线条相对干净,png用来直接放在作业文档里,足够清晰。导出的时候注意分辨率,默认分辨率有时候偏低,放大之后会模糊,可以在导出选项里调高。
不是所有情况都适合scatter,如果只是简单标记少量点,plot搭配标记符号也能做出类似效果,但它本质还是绘图连线函数,一不小心就带出线条,数据点多的时候,远不如scatter顺手。
那次做完作业之后,没有把代码好好存起来,隔了两周再要画同类图,又得重新回忆参数顺序,又重复踩了holdon的坑。