罗兰谈MATLAB的艺术

将想法转化为MATLAB

请注意

罗兰谈MATLAB的艺术已存档,不会更新。

矢量化图形操作

今天我们来谈谈情节中元素的变化特征。我将用一个例子映射的工具箱.我的目标是向您展示修改图形的好方法。

内容

设置

首先,我把示例目录放到我的路径上,这样我就可以得到包含多边形状态边界的形状文件。

目录(fullfile (userpath,“例子”“mapexgeo”))

读取美国高分辨率数据

状态= shaperead(“usastatehi”“UseGeoCoords”,真正的);

创建一个符号规格将阿拉斯加和夏威夷显示为红色多边形。

符号= makesymbolspec(“多边形”...“名字”“阿拉斯加”“FaceColor”“红色”},...“名字”“夏威夷”“FaceColor”“红色”});

创建基础地图

创建一个北美世界地图,阿拉斯加和夏威夷为红色,所有其他州为蓝色。

图worldmap (北美的) statePatches = geoshow(状态,“SymbolSpec”、符号、...“DefaultFaceColor”“蓝”“DefaultEdgeColor”“黑”)轴
statePatches = Group with properties: Children: [51×1 Patch] Visible: 'on' HitTest: 'on'使用GET显示所有属性

改变一种状态颜色

我们可以用简单的点符号改变一个状态的颜色。这是另一种了解州的方法。

statePatches.Children(17)。FaceColor =“y”;州(17)。的名字
肯塔基州

换另一个

我可以将状态颜色改为自定义颜色。

statePatches.Children(42)。FaceColor =[0.2, 0.8, 0.7]; states(42).Name
田纳西州

将所有州的补丁设置为一种颜色

现在把所有州的颜色都换成洋红色。在这种情况下,我必须将所有的补丁组合在一起,形成一个以逗号分隔对于左边。我需要确保右边有同样多的输出,因此使用交易

[statePatches.Children。FaceColor = deal(“米”);

现在将每个状态改为不同的颜色。让我们先创建一个颜色数组。

stateColors1 = rand(长度(状态),3);stateColors2 = fliplr(stateColors1);

将每个状态更改为不同的颜色- for循环

当然,我们可以用循环来做。尽管这是一个相对较小的示例,但让我们为它计时。

抽搐npatch = 1:length(states) statePatches.Children(npatch)。FaceColor = stateColors1(npatch,:);结束colorTimes = toc;

我们也可以用矢量化的方式来做这件事,如果有足够多的补丁,这可以节省大量的时间。在这种情况下,51个补丁,时间不是真正的大问题。我们已经看到客户通过复杂得多的场景极大地提高了他们的代码速度。

我们需要做的不是分别设置每种颜色。相反,我们使用“老式”函数,并利用它提供的向量化。我要做的是传入一个句柄数组。另外,我将想要调整的属性(或多个属性)包含在单元格数组中。我将每个句柄的输入作为匹配单元格数组的元素提供。这需要我将RGB的三胞胎转换为单元格。我可以用num2cell

将每个状态更改为不同的颜色集

开始吧。

抽搐(statePatches设置。孩子,{“FaceColor”}, num2cell (flipud (stateColors2), 2));colorTimes(2) = toc
colorTimes = 0.052154 0.026216

结论

有时图形的矢量化不需要太大的努力。比如把每个补丁都改成一种颜色。使用更新后的图形系统引入的符号很容易,而且代码可读性很高。

有时为了性能考虑,可能在某些情况下向量化仍然是合适的,而使用新符号则无法实现。在这种情况下,您将需要我在本文中使用的各种技术和函数。这对你有帮助吗?请分享你的想法在这里




发布与MATLAB®R2016b


  • 打印
  • 发送电子邮件

评论

如欲留言,请点击在这里登录您的MathWorks帐户或创建一个新帐户。