以精确colormap contourfcmap:填充等高线图
contourfcmap.m:填满轮廓plot with precise colormap
作者:凯利卡尼
这个库包含的代码contourfcmap.m
Matlab函数,以及所有相关的功能需要运行它。
这个函数创建一个阴影等值线图,类似contourf创建的函数。然而,contourf情节之间的关系及其colormap(即哪些颜色对应于每个等高线间距),往往是混乱和不一致的。这个函数允许用户指定哪些颜色用在每一个时间间隔,并选择颜色区域超过轮廓线的限制。
内容
- 开始
- 语法
- 描述
- 例子
- contourfcmap背后的算法
- 贡献
开始
先决条件
这个函数需要Matlab R14或更高版本。
下载和安装
这段代码可以下载<一个href="https://github.com/kakearney/contourfcmap-pkg/" target="_blank" rel="nofollow noopener noreferrer">Github一个>或者是<一个href="//www.tianjin-qmedu.com/au/matlabcentral/fileexchange/29638" rel="nofollow noopener noreferrer" target="_blank">MatlabCentral文件交换一个>。文件交换的条目从GitHub每天更新存储库。
Matlab搜索路径
以下文件夹需要添加到您的(通过Matlab搜索路径目录
,pathtool
等):
contourfcmap- - - - - -包裹/FEX- - - - - -function_handlecontourfcmap- - - - - -包裹/arclengthcontourfcmap- - - - - -包裹/contourcscontourfcmap- - - - - -包裹/contourfcmapcontourfcmap- - - - - -包裹/distance2curvecontourfcmap- - - - - -包裹/fillnancontourfcmap- - - - - -包裹/interparccontourfcmap- - - - - -包裹/极大极小contourfcmap- - - - - -包裹/multiplepolyintcontourfcmap- - - - - -包裹/parsepvcontourfcmap- - - - - -包裹/pcolorbar
语法
contourfcmap(x,y,z,clev,提出)contourfcmap(x,y,z,clev,提出,的名字,价值)h=contourfcmap(…)
描述
clev contourfcmap (x, y, z,提出)
块填充等高线图的矩阵z
与坐标x
和y
。z
必须至少2 x2矩阵;x
和y
可以是矩阵定义网格z
,或者向量对应的列和行坐标,分别。clev
是一个n x 1向量定义轮廓线的水平,然后呢提出
是一个n - 1 x 1 colormap数组定义要使用的颜色之间的每个轮廓的水平。
clev contourfcmap (x, y, z,提出,“瞧”,lo)
表示颜色值罗
(1 x 3 RGB数组)用于任何地区数据低于第一轮廓水平。默认的是白色的。
clev contourfcmap (x, y, z,提出,“嗨”,嗨)
表示颜色值嗨
(1 x 3 RGB数组)用于任何地区的数据高于去年等高水平。默认的是白色的。
clev contourfcmap (x, y, z,提出,“方法”,方法)
允许你切换“上色”和“calccontour”算法(详情见下文)。默认是“上色”(虽然我现在推荐的calccontour R2017b或更高版本)。
clev contourfcmap (x, y, z,提出,“cbarloc”, cbarloc)
添加一个使用colorbar psuedo-colorbar位置指示器cbarloc
。默认是没有colorbar。
clev contourfcmap (x, y, z,提出,“evencb”, evencb)
指示是否在colorbar均匀颜色空间(evencb = true)或大小根据clev值(evencb = false)。默认是假的。
h = contourfcmap (…)
返回一个结构h
的字段持有colorbar轴处理结构(h.cb
,请参阅pcolorbar.m
详情),轮廓对象(h.h
)、轮廓矩阵(h.c
)和补丁对象(惠普
)。
例子
首先我们将情节contourf阴谋使用标准的Matlab函数。没有标签的轮廓线,很难告诉colorbar对应值的颜色间隔contourf阴谋。
数=0;%数据(x,y]=meshgrid(linspace(0,1,One hundred.));z=山峰(One hundred.);clev=(- - - - - -5- - - - - -3- - - - - -2:。5:235];%设置轴h.fig=图(”颜色”,”w”);h。斧头(1)=轴(”位置”,(0.050.250.4250.5]);h。斧头(2)=轴(”位置”,(0.5250.250.4250.5]);%情节轴(h。斧头(1));contourf(x,y,z,clev);cb=colorbar(”eastoutside”);colormap(h。斧头(1),飞机);标题(h。斧头(1),”contourf”);
使用contourfcmap,我们可以设置简洁的颜色,所以它是更容易告诉哪些颜色对应的值。
轴(h。斧头(2));hc=contourfcmap(x,y,z,clev,飞机(12),…”罗”,(。8。8。8),…”嗨”,(。2。2。2),…”cbarloc”,”eastoutside”,……”方法”,”calccontour”);标题(h。斧头(2),”contourfcmap”);
如果你喜欢,你可以设置colorbar显示轮廓间隔等间隔,即使没有值。
删除(hc。cb。cb);删除(hc。cb。斧头);班;hc=contourfcmap(x,y,z,clev,飞机(12),…”罗”,(。8。8。8),…”嗨”,(。2。2。2),…”cbarloc”,”eastoutside”,……”方法”,”calccontour”,……”evencb”,真正的);标题(h。斧头(2),”contourfcmap”);
contourfcmap背后的算法
这个函数开始生活在2010年作为一个非常简单的函数。在那个时候,这只是一个包装器contourf
。轮廓对象在2010年前后Maltab结合一些线路(等值线)和补丁(阴影区域),和我的函数循环这些补丁和新颜色分配给他们的CData属性。
然后2014 b版本出现,有了它,一个完整的检修Matlab的图形对象。在这些新代处理图形(例如HG2),轮廓对象变得更加复杂。他们现在是由TriangleStrips、低级mostly-undocumented图形对象,真的不是为了被篡改。
我更新函数重复旧流程,循环的轮廓和改变颜色。但是这些颜色变化不是很固定。改变colormap,添加一个colorbar,最令人沮丧的是,打印数据文件(使用任何依赖于打印命令,包括印刷、saveas, export_fig,等等)撤销它。函数是相当无用的,如果我无法改变。
所以在2014年,我引入了一个新算法contourfcmap,“calccontour”方法。这个版本仍然使用轮廓函数做等高线的繁重计算(仿形很难!),然后尝试画出阴影区域使用补丁,在老HG1版本。我最初认为这只是一个出租汽车司机替身重新上色,直到我能坚持。这很好工作了简单的数据集,但对更复杂的破裂,特别是那些涉及nan和non-cartesian网格。但重新着色选项重置问题已持续通过Matlab更新版本的发布(实际上,它变得更糟)。
我现在(2018年3月)的改革刚刚完成calccontour选项。这个更新可能打破与旧代码使用back-compatibility contourfcmap,自从我修改的一些输出变量(尽管它仍然应该支持所有年长的语法的输入变量)。万博1manbetx我扩大了代码更健壮non-cartesian网格和nan, polyshape对象的介绍,多边形的计算不再需要映射的工具箱。虽然情节有点慢,这个算法也修复一些问题与Matlab的颜色(或者更确切地说,没有颜色)lower-than-lowest-contour地区。最后,我改变了colorbar代码依赖pcolorbar函数,它提供了更健壮的调整(类似于一个真正的colorbar)当一个人使轴的变化。
这个例子走你通过我的思维过程算法,和一些contourf我试图解决问题。
我们从山顶开始数据:
关闭所有;图;(x,y,z]=山峰;海关=散射(x(:),y(:),10,z(:),”填满”);六氯苯=colorbar;集(gca,”这一”,- - - - - -1515),”xlim”,- - - - - -4.54.5),”ylim”,- - - - - -4.54.5]);持有在;
Matlab的大多数示例等高线数据假设一个笛卡儿网格(即数据沿着x轴和y轴对齐,如图像)。但它不需要…任何结构化网格。让我们添加一些倾斜和旋转,以确保这个例子涵盖了更复杂的情况下:
y=y+罪(x);th=π/3;R=(因为(th)- - - - - -罪(th);罪(th)因为(th));xy=R*(x(:)y(:)]”;x=重塑(xy(1,:),大小(x));y=重塑(xy(2,:),大小(y));删除(海关);海关=散射(x(:),y(:),10,z(:),”填满”);
等高线数据还可以包括nan。有时,这些代表了一个失踪的两个数据点。但是他们也可以发生在更大的块;例如,海洋的地图数据可能代表土地,nan。我们将添加两个封闭的(数据)包围和敞开式nan(网格连接的一面),并确保我们有一些额外的数据岛的高和低的数据太(您将看到为什么一点):
z(z<0.2&z>0)=南;z(1:3,1:3)=- - - - - -15;z(结束- - - - - -3:结束,结束- - - - - -3:结束)=15;z(25:30.,1:2)=- - - - - -15;删除(海关);海关=散射(x(:),y(:),10,z(:),”填满”);
假设我们想把一些轮廓,与特定的颜色之间的间隔。我们可以通过绘制离散值的散点图:
%离散化本=离散化(z,clev);本(z<clev(1))=0;本(z>clev(结束))=长度(clev)+1;%颜色clev=(- - - - - -5- - - - - -3- - - - - -2:。5:235];提出=[…0.650980.807840.89020.121570.470590.705880.698040.874510.541180.20.627450.172550.984310.603920.60.89020.101960.10980.992160.749020.4352910.4980400.792160.698040.839220.415690.239220.60392110.60.694120.349020.15686];罗=(0.572550.584310.56863];嗨=(0.847060.862750.83922];%情节删除(海关);海关=散射(x(:),y(:),10,本(:),”填满”);colormap([罗;提出;嗨]);集(gca,”这一”,- - - - - -0.5长度(clev)+0.5]);tklabel=(”罗”…arrayfun(@ (一个,b)sprintf(”% .1f- - - - - -% .1f”,一个,b),…clev(1:结束- - - - - -1),clev(2:结束),”大学”,0)…”嗨”];集(六氯苯,”蜱虫”,0:长度(clev),”ticklabels”,tklabel);
我们可以尝试使用相同的离散化方法来得到我们期望的等高线图。
删除(海关);(cc,hc]=contourf(x,y,本,0.5:1:长度(clev));
但这牺牲轮廓线的分辨率。我们也可以试着摆弄colormap,试图让颜色匹配轮廓水平。我通过做这个<一个href="//www.tianjin-qmedu.com/au/matlabcentral/fileexchange/28943-color-palette-tables---cpt--for-matlab" rel="nofollow noopener noreferrer" target="_blank">cptcmap一个>函数。
loval=clev(1)- - - - - -(clev(结束)- - -clev(1))*0.1;hival=clev(结束)+(clev(结束)- - -clev(1))*0.1;ctable=[[lovalclev]”(罗;提出;嗨)*255年(clevhival]”(罗;提出;嗨)*255年]”;支撑材=打开外部文件(”cmaptemp.cpt”,”wt”);流(支撑材,”% .2f% .0f% .0f% .0f% .2f% .0f% .0f% .0f \ n”,ctable);文件关闭(支撑材);(cmap2,lims]=cptcmap(”cmaptemp”);删除(”cmaptemp.cpt”);删除(hc);(cc,hc]=contourf(x,y,z,clev);集(gca,”这一”,lims);colormap(cmap2);集(六氯苯,”蜱虫”,clev,”TickLabelsMode”,”汽车”);
主要作品,有几个缺点。首先,调整colormap看起来像它颜色不均匀间隔需要一些manaul计算。即使cptcmap,你要提前做一些设置。同样,如果我们添加上面的散点图,我们将会看到一些问题:
海关=散射(x(:),y(:),10,z(:),”填满”);集(海关,”markeredgecolor”,”w”);
大部分的区域匹配点……除了应该有深灰色的轮廓,即数据低于指定的最低线。根据Matlab版本,当您运行这个,右边的封闭圈可能是也可能不是阴影。在所有Matlab版本,没围起来的区域位,靠墙的电网)是没有阴影的。
这是contourfcmap派上用场的额外的计算:
删除(海关);删除(hc);删除(六氯苯);h=contourfcmap(x,y,z,clev,提出,……”罗”,罗,……”嗨”,嗨,……”cbarloc”,”eastoutside”,……”方法”,”calccontour”);
结论:慢于一个简单的等高线图。但它颜色正常补丁,包括lower-than-lowest-contour地区。没有需要做任何棘手colormap计算。如果您的应用程序需要极快的渲染,lower-than-lowest的不是为你一个问题,你最好还是使用上面的技巧之一。否则,contourfcmap应该是容易的解决方案。
贡献
这个包是受欢迎的社区的贡献!
报告bug,请提交<一个href="https://github.com/kakearney/contourfcmap-pkg/issues" target="_blank" rel="nofollow noopener noreferrer">一个问题一个>在GitHub,包括:
- 您的操作系统
- 你的版本的Matlab和所有相关工具箱(类型
版本
在Matlab命令行得到这个信息) - 代码/数据复制错误或缺陷的行为,和任何错误消息收到的全文
也请随时提交增强请求或发送拉请求(通过GitHub) bug修复和新特性。
我做监控MatlabCentral FileExchange条目在评论中提出的任何问题,但更愿意在GitHub跟踪问题。
发表与MATLAB R2018a
引用作为
凯利卡尼(2023)。以精确colormap contourfcmap:填充等高线图GitHub (https://github.com/kakearney/contourfcmap-pkg)。检索。
MATLAB版本兼容性
平台的兼容性
窗户 macOS Linux类别
标签
FEX-function_handle
arclength
contourcs
contourfcmap
distance2curve
fillnan
interparc
极大极小
multiplepolyint
parsepv
pcolorbar
版本使用GitHub缺省分支不能下载
版本 | 发表 | 发布说明 | |
---|---|---|---|
1.7.0.1 | 有关GitHub的自述 |
|
|
1.7.0.0 | 小更新描述,指出读者github readme。 |
|
|
1.6.0.0 | 联系到GitHub库 |
|
|
1.5.0.0 | 纠正一个错误点在多边形生成角落的补丁的顺序。 |
||
1.4.0.0 | 重写R2014b,不再依赖contourf对象 |
||
1.3.0.0 | 修复新colorbar中偷了重点从轴。 |
||
1.2.0.0 | 固定意外遗漏的helper函数colorbar代(极大极小)。也纠正小错误例子并添加更丰富的示例图像。 |
||
1.1.0.0 | 小的语法描述的修复 |
||
1.0.0.0 |