color工具
<p>[TOC]</p>
<pre><code class="language-python">%matplotlib inline
%load_ext autoreload
%autoreload 2
import meteva.base as meb
import matplotlib.pyplot as plt
import numpy as np</code></pre>
<pre><code>The autoreload extension is already loaded. To reload it, use:
%reload_ext autoreload</code></pre>
<p>为了方便设置一些和检验相关的colorbar,本程序集成了一些配置好的cmap和clevs,一种配置采用一个字符串表示,根据后面介绍的函数可以通过这些字符串获取相应的colorbar设置。 为了进一步方便检索这些配置选项,本程序进一步将这些字符串和一个类变量进行绑定,在程序输入时,可以通过编辑器的自动弹出功能,选取相应的字符串,从而避免输入错误导致的影响。这些字符串和对应的类变量如下:</p>
<pre><code class="language-python">class cmaps:
rain_1h = &quot;rain_1h&quot;
rain_1h_error = &quot;rain_1h_error&quot;
rain_3h = &quot;rain_3h&quot;
rain_3h_error = &quot;rain_3h_error&quot;
rain_24h = &quot;rain_24h&quot;
rain_24h_error = &quot;rain_24h_error&quot;
temp_2m = &quot;temp_2m&quot;
temp_2m_error = &quot;temp_2m_error&quot;
rh = &quot;rh&quot;
rh_error = &quot;rh_error&quot;
vis = &quot;vis&quot;
vis_error = &quot;vis_error&quot;
wind_speed = &quot;wind_speed&quot;
wind_speed_error = &quot;wind_speed_error&quot;
tcdc = &quot;tcdc&quot;
tcdc_error = &quot;tcdc_error&quot;
bias = &quot;bias&quot;
error = &quot;error&quot; </code></pre>
<p><strong>调用示例</strong></p>
<pre><code class="language-python">meb.cmaps.bias</code></pre>
<pre><code>'bias'</code></pre>
<h1>自定义cmap,clevs</h1>
<p><strong>def_cmap_clevs(cmap = "rainbow",clevs = None,vmin = None,vmax = None,extend = None):</strong><br />
<strong>在涉及填色的绘图中,核心的问题是设置clevs和cmap, 而设置clevs和cmap的方式有多种,本程序支持如下几种方式</strong> </p>
<ol>
<li>根据并不匹配的clevs 和cmap 生成匹配的clevs和cmaps, 生成的colorbar的颜色种类数由clevs长度确定;</li>
<li>根据vmin和vmax生成clevs, clevs的最大最小值大致由前两者决定。但考虑到vmin和vmax 在程序中很可能不是人工设置的,其中小数位会非常多,因此程序生成的clevs列表的值会自动保留较小有效位数,其最大最小值不一定严格等于vmin,vmax,再有clevs和cmap联合生成互相匹配的clevs和cmap;</li>
<li>当cmap参数为某些本函数指定的字符串时,本函数会提供配置好的clevs 和cmap。 例如当cmap = "temp_2m" 时,本函数会提供配置好的温度配色方案对应clevs和cmap;</li>
<li>由cmap 和 vmin,vmax联合生成clevs和cmaps,其中cmap 是本程序指定的一些字符串。例如当cmap = “bias”时,考虑到bias的取值范围是0到无穷,因此本函数会结合vmax的值,设置一个具体的clevs,使得colorbar在0-1范围内是蓝——白色,1-2范围内是白——红色,2-vmax的范围内是红——黑色。 </li>
</ol>
<table>
<thead>
<tr>
<th style="text-align: left;">参数</th>
<th style="text-align: left;">说明(上述两个函数参数意义和用法完全相同)</th>
</tr>
</thead>
<tbody>
<tr>
<td style="text-align: left;"><strong>cmap</strong></td>
<td style="text-align: left;">字符或者matplotlib 的cm对象。 缺省值"rainbow"对应彩虹色方案。 当cmap为字符时支持两种情况,一种是matplotlib 能够识别的字符串,例如"rainbow","bwr"等等,具体可以参考https://matplotlib.org/tutorials/colors/colormaps.html, 另外则是meteva定义的一些和预报检验有关的一些配色方案,具体内容如本页前面class cmaps所包含的内容</td>
</tr>
<tr>
<td style="text-align: left;"><strong>clevs</strong></td>
<td style="text-align: left;">指定的填色等级,其内容为一维实数列表,可以缺省</td>
</tr>
<tr>
<td style="text-align: left;"><strong>vmin</strong></td>
<td style="text-align: left;">colorbar的最小值</td>
</tr>
<tr>
<td style="text-align: left;"><strong>vmax</strong></td>
<td style="text-align: left;">colorbar的最大值, 如果生成的填色等级数目大于15,且vmin、vmax都不为None,则程序会进一步根据vmin和vmax 从整个colorbar中裁剪出能够覆盖所绘制的数据的取值范围的一部分colorbar(等级数 >=15),这样避免colorbar太密集不利于阅读,同时批量出图是每个colorbar的颜色范围虽然有差异,但是颜色和数值的对应标准是一致的</td>
</tr>
<tr>
<td style="text-align: left;"><strong>extend</strong></td>
<td style="text-align: left;">extend 参数用于控制 colorbar 的扩展端口的外观,用法和matplotlib中一致,默认值为"neither" ,即colorbar两端都是方的。extend = "both"时,colorbar 的两端都是尖的。extend = "min"时,colorbar 的最小值一端是尖的。extend = "max"时,colorbar 的最大值一端是尖的</td>
</tr>
<tr>
<td style="text-align: left;"><font face="黑体" color=blue size=3>return</font></td>
<td style="text-align: left;">元组,第一个元素为matplotlib的cm对象, 第二个元素为的clevs</td>
</tr>
</tbody>
</table>
<p><strong>调用示例:</strong></p>
<pre><code class="language-python"># 基于matplotlib内置的配色方案名称 和clevs 生成 colorbar所需设置
cmap0,clev0 = meb.def_cmap_clevs(cmap = &quot;rainbow&quot;,clevs = [0,0.2,0.4,0.6,0.8,1.0])
meb.tool.color_tools.show_cmap_clev(cmap0,clev0)</code></pre>
<p><img src="https://www.showdoc.com.cn/server/api/attachment/visitfile/sign/73c50b34ad6ac508940e17521367999f?showdoc=.jpg" alt="" /></p>
<pre><code class="language-python"># 基于matplotlib内置的配色方案名称 和vmin,vmax生成 colorbar所需设置
cmap0,clev0 = meb.def_cmap_clevs(cmap = &quot;rainbow&quot;,vmin = 0,vmax =1)
meb.tool.color_tools.show_cmap_clev(cmap0,clev0)</code></pre>
<p><img src="https://www.showdoc.com.cn/server/api/attachment/visitfile/sign/35c06f8bbc36340579472de0c9599867?showdoc=.jpg" alt="" /></p>
<pre><code class="language-python">print(cmap0) # cmap0是一个matplotlib的cm对象</code></pre>
<pre><code>&lt;matplotlib.colors.ListedColormap object at 0x0000027589598888&gt;</code></pre>
<pre><code class="language-python"># 基于matplotlib的cm对象,和clevs 生成匹配的cmap,clevs
cmap1,clev1 = meb.def_cmap_clevs(cmap = cmap0, clevs = np.arange(30))
meb.tool.color_tools.show_cmap_clev(cmap1,clev1)
# 原先cmap由上面一个示例中生成,它是一个包含11个等级的cm对象
#但是通过和clevs匹配,重新返回的cmap对象是30个等级的</code></pre>
<p><img src="https://www.showdoc.com.cn/server/api/attachment/visitfile/sign/a60dbfba19aa57a7f0ea97d5f958b9a2?showdoc=.jpg" alt="" /></p>
<pre><code class="language-python"># 基于matplotlib的cm对象,和clevs 生成匹配的cmap,clevs
cmap2,clev2 = meb.def_cmap_clevs(cmap = cmap0, vmin = 0,vmax = 28)
meb.tool.color_tools.show_cmap_clev(cmap2,clev2)
# 原先cmap由上面一个示例中生成,它是一个包含10个等级的cm对象
#但是通过和vmin,vmax 生成的clevs匹配,重新返回的cmap对象是15个等级的</code></pre>
<p><img src="https://www.showdoc.com.cn/server/api/attachment/visitfile/sign/c8a3dc9e80a8f788e41b3b8e93e68c82?showdoc=.jpg" alt="" /></p>
<pre><code class="language-python"># 基于meteva集成的配色方案, 示例2m温度的配色方案
cmap,clev = meb.def_cmap_clevs(&quot;temp_2m&quot;)
meb.tool.color_tools.show_cmap_clev(cmap,clev)</code></pre>
<p><img src="https://www.showdoc.com.cn/server/api/attachment/visitfile/sign/e3ac502e1f1d6ce049c3c78b7d770cf5?showdoc=.jpg" alt="" /></p>
<pre><code class="language-python"># 上述示例中“temp_2m”也可以换成meb.cmaps.temp_2m,效果是一致的
cmap,clev = meb.def_cmap_clevs(meb.cmaps.temp_2m)
meb.tool.color_tools.show_cmap_clev(cmap,clev)</code></pre>
<p><img src="https://www.showdoc.com.cn/server/api/attachment/visitfile/sign/78d4ddf464a6049e7f706619758a1705?showdoc=.jpg" alt="" /></p>
<pre><code class="language-python"># 在上例中通过参数“temp_2m”已经能够确定cmap和clevs了,此时如果进一步增加vmin,vmax参数
# 则会根据colorbar的size来绝对是否需要裁减colorbar.
#在本例中temp_2m对应的完整的colorbar超过了15个等级,而实际数据可能只涉及到其中10个等级
# 此时程序会根据设置的vmin,vmax 裁剪出其中15个等级
cmap,clev = meb.def_cmap_clevs(meb.cmaps.temp_2m,vmin = 0,vmax = 20)
meb.tool.color_tools.show_cmap_clev(cmap,clev)</code></pre>
<p><img src="https://www.showdoc.com.cn/server/api/attachment/visitfile/sign/a43c441394db654f0327548a176c05de?showdoc=.jpg" alt="" /></p>
<pre><code class="language-python"></code></pre>
<pre><code class="language-python"># 在本例中提供了meteva集成的ts配色方案,其中固定了ts的取值范围是0-1
cmap,clev = meb.def_cmap_clevs(meb.cmaps.ts)
meb.tool.color_tools.show_cmap_clev(cmap,clev)</code></pre>
<p><img src="https://www.showdoc.com.cn/server/api/attachment/visitfile/sign/16baaeb890056b337f6706d63caa7a06" alt="" /></p>
<pre><code class="language-python"># 在本例中提供了meteva集成的bias配色方案,其中设置了非等间距的颜色等级
#0-1等级范围内是蓝-白
#1-2等级范围内是白-红
#2 -vmax等级范围内是红-黑
cmap,clev = meb.def_cmap_clevs(meb.cmaps.bias, vmax = 5)
meb.tool.color_tools.show_cmap_clev(cmap,clev)</code></pre>
<p><img src="https://www.showdoc.com.cn/server/api/attachment/visitfile/sign/96555b8e7ad32fcbbd062fc9afdea01e?showdoc=.jpg" alt="" /></p>
<p>本程序库集成的其它填色方案:</p>
<pre><code class="language-python"># 1小时降水
cmap,clev = meb.def_cmap_clevs(meb.cmaps.rain_1h)
meb.tool.color_tools.show_cmap_clev(cmap,clev)</code></pre>
<p><img src="https://www.showdoc.com.cn/server/api/attachment/visitfile/sign/5e24bba972611ee1f8aaf0081e2e497e?showdoc=.jpg" alt="" /></p>
<pre><code class="language-python"># 1小时降水误差
cmap,clev = meb.def_cmap_clevs(meb.cmaps.rain_1h_error)
meb.tool.color_tools.show_cmap_clev(cmap,clev)</code></pre>
<p><img src="https://www.showdoc.com.cn/server/api/attachment/visitfile/sign/8d1e66027df8741f42cd12a18d344573?showdoc=.jpg" alt="" /></p>
<pre><code class="language-python"># 3小时降水
cmap,clev = meb.def_cmap_clevs(meb.cmaps.rain_3h)
meb.tool.color_tools.show_cmap_clev(cmap,clev)</code></pre>
<p><img src="https://www.showdoc.com.cn/server/api/attachment/visitfile/sign/789e9c1a15cd5d491e9b192fe1c8ea63?showdoc=.jpg" alt="" /></p>
<pre><code class="language-python"># 3小时降水误差
cmap,clev = meb.def_cmap_clevs(meb.cmaps.rain_3h_error)
meb.tool.color_tools.show_cmap_clev(cmap,clev)</code></pre>
<p><img src="https://www.showdoc.com.cn/server/api/attachment/visitfile/sign/acca414a4778b291a0fc01a2aad4672d?showdoc=.jpg" alt="" /></p>
<pre><code class="language-python"># 24小时降水(注意,它非业务规范,只是参考业务规范制作的一种相对精细的配色方案)
cmap,clev = meb.def_cmap_clevs(meb.cmaps.rain_24h)
meb.tool.color_tools.show_cmap_clev(cmap,clev)</code></pre>
<p><img src="https://www.showdoc.com.cn/server/api/attachment/visitfile/sign/2bfd974bbbed134bdf8e064224820c0b" alt="" /></p>
<pre><code class="language-python">#相对湿度
cmap,clev = meb.def_cmap_clevs(meb.cmaps.rh)
meb.tool.color_tools.show_cmap_clev(cmap,clev)</code></pre>
<p><img src="https://www.showdoc.com.cn/server/api/attachment/visitfile/sign/5e771b00f3cc2f2ccf96dd6bc6cc38ff?showdoc=.jpg" alt="" /></p>
<pre><code class="language-python">#相对湿度误差
cmap,clev = meb.def_cmap_clevs(meb.cmaps.rh_error)
meb.tool.color_tools.show_cmap_clev(cmap,clev)</code></pre>
<p><img src="https://www.showdoc.com.cn/server/api/attachment/visitfile/sign/c31c6b9eb7d71c3d60f69e19615c32eb?showdoc=.jpg" alt="" /></p>
<pre><code class="language-python">#能见度
cmap,clev = meb.def_cmap_clevs(meb.cmaps.vis)
meb.tool.color_tools.show_cmap_clev(cmap,clev)</code></pre>
<p><img src="https://www.showdoc.com.cn/server/api/attachment/visitfile/sign/b60164954f46d33dc78475a073320d23?showdoc=.jpg" alt="" /></p>
<pre><code class="language-python">#能见度误差
cmap,clev = meb.def_cmap_clevs(meb.cmaps.vis_error)
meb.tool.color_tools.show_cmap_clev(cmap,clev)</code></pre>
<p><img src="https://www.showdoc.com.cn/server/api/attachment/visitfile/sign/8af7a854f8e2d3db5d0d24db87147238?showdoc=.jpg" alt="" /></p>
<pre><code class="language-python">#风速
cmap,clev = meb.def_cmap_clevs(meb.cmaps.wind_speed)
meb.tool.color_tools.show_cmap_clev(cmap,clev)</code></pre>
<p><img src="https://www.showdoc.com.cn/server/api/attachment/visitfile/sign/891b470c66f077cb231f11b63f02f59c?showdoc=.jpg" alt="" /></p>
<pre><code class="language-python">#风速误差
cmap,clev = meb.def_cmap_clevs(meb.cmaps.wind_speed_error)
meb.tool.color_tools.show_cmap_clev(cmap,clev)</code></pre>
<p><img src="https://www.showdoc.com.cn/server/api/attachment/visitfile/sign/fdeef4ea74184104d44f331b067a0fd1?showdoc=.jpg" alt="" /></p>
<pre><code class="language-python">#总云量
cmap,clev = meb.def_cmap_clevs(meb.cmaps.tcdc)
meb.tool.color_tools.show_cmap_clev(cmap,clev)</code></pre>
<p><img src="https://www.showdoc.com.cn/server/api/attachment/visitfile/sign/a3cf73d96680c7a9e8162cb97682f74f?showdoc=.jpg" alt="" /></p>
<pre><code class="language-python">#总云量误差
cmap,clev = meb.def_cmap_clevs(meb.cmaps.tcdc_error)
meb.tool.color_tools.show_cmap_clev(cmap,clev)</code></pre>
<p><img src="https://www.showdoc.com.cn/server/api/attachment/visitfile/sign/e9ff5ba23d36b106a9f272c9a31e61e6?showdoc=.jpg" alt="" /></p>
<pre><code class="language-python"></code></pre>
<pre><code class="language-python"># 一般误差,采用一般蓝红色调表示误差,对0值附近的结果不太需要关注时采用该色标
cmap,clev = meb.def_cmap_clevs(meb.cmaps.error,vmin = -12,vmax = 12)
meb.tool.color_tools.show_cmap_clev(cmap,clev)</code></pre>
<p><img src="https://www.showdoc.com.cn/server/api/attachment/visitfile/sign/81d0dc62ec9455d016514726b1d2ae6e" alt="" /></p>
<pre><code class="language-python"># 平均误差, 在 +-0位置增加了强烈的对比,以凸显误差的符号
cmap,clev = meb.def_cmap_clevs(meb.cmaps.me,vmin = -12,vmax = 12)
meb.tool.color_tools.show_cmap_clev(cmap,clev)</code></pre>
<p><img src="https://www.showdoc.com.cn/server/api/attachment/visitfile/sign/fadf38ebdbe765bde949d49046eafa2c" alt="" /></p>
<pre><code class="language-python"># 基于目标识别检验算法中,用来区分显示不同的目标的颜色
cmap,clev = meb.def_cmap_clevs(meb.cmaps.mode, vmax = 10)
meb.tool.color_tools.show_cmap_clev(cmap,clev)</code></pre>
<p><img src="https://www.showdoc.com.cn/server/api/attachment/visitfile/sign/f8a06875497ce9a4474aa049da7134ff" alt="" /></p>
<pre><code class="language-python"># 环境气象的色卡,默认返回pm2.5的等级
cmap,clev = meb.def_cmap_clevs(meb.cmaps.environment)
meb.tool.color_tools.show_cmap_clev(cmap,clev)</code></pre>
<p><img src="https://www.showdoc.com.cn/server/api/attachment/visitfile/sign/514580b584ad2261cbe316b677e9c7b6" alt="" /></p>
<pre><code class="language-python"># 环境气象的色卡,设置自定义的等级
cmap,clev = meb.def_cmap_clevs(meb.cmaps.environment,clevs=[10,20,30,40,50,60])
meb.tool.color_tools.show_cmap_clev(cmap,clev)</code></pre>
<p><img src="https://www.showdoc.com.cn/server/api/attachment/visitfile/sign/3d6f8cdf3755866a0fdf2ff667f9514c" alt="" /></p>
<h1>获取区分度大的颜色列表</h1>
<p>matplotlib默认的颜色顺序是tab10。如果用户用plot或bar函数依次绘制多组数据,matplotlib会依次循环采用tab10种颜色绘制图形,如果数据超过10种,就存在两组数据用到同一种颜色。如果在绘图时legend超过10种时,则容易出现颜色区分度不足导致图片可读性降低的问题,为此需要尽量设置出一组区分度更大的颜色。
获得任意N个区分度最高的RGB颜色值是一个经典的问题。在<a href="https://blog.csdn.net/choumin/article/details/90320297">CSDN</a>和<a href="https://stackoverflow.com/questions/470690/how-to-automatically-generate-n-distinct-colors">Stack Overflow</a> 论坛上给出了多种解决方案。MetEva对其中的两种方案进行了Python实现和算法改进,形成函数如下:</p>
<p><strong><font face="黑体" color=blue size = 3>get_seprated_rgb_method1(num):</font></strong><br />
方法:将颜色用hsl(色相、饱和度和亮度)三个参数表示,将hsl投影到一个球体坐标,将h对应为经度,s对应到半径,l对应到纬度(之所以采用球体映射而不是圆柱体映射,是考虑到最亮的白色和最暗的黑色区域无论色相和饱和度差异有多大,时间颜色是接近的)。在球体空间,放置N个小球,使得N个小球之间距离最大化,从而获得球体坐标,进一步转变为hsl坐标,再转换为rgb坐标返回。该算法的缺点是需要一定的耗时,大概在10s级别。</p>
<p><strong><font face="黑体" color=blue size = 3>get_seprated_rgb_method2(num):</font></strong><br />
方法:将颜色用hsl(色相、饱和度和亮度)表示,首先将采用等间距的设置方法将每种颜色的色相区别最大化,再让饱和度和亮度值分别在0.5-1.0, 0.25-0.75的范围内波动。该算法几乎没有耗时问题。</p>
<table>
<thead>
<tr>
<th style="text-align: left;">参数</th>
<th style="text-align: left;">说明</th>
</tr>
</thead>
<tbody>
<tr>
<td style="text-align: left;"><strong>num</strong></td>
<td style="text-align: left;">获取的区分度较大的颜色列表的长度</td>
</tr>
<tr>
<td style="text-align: left;"><font face="黑体" color=blue size=3>return</font></td>
<td style="text-align: left;">二层列表,内层列表时rgb值,取值范围是0-1</td>
</tr>
</tbody>
</table>
<p><strong>调用示例:</strong></p>
<pre><code class="language-python">#以下是tab10的效果
cm0 = cm.get_cmap(&quot;tab10&quot;)
color_list0 = []
for i in range(10):
color_list0.append(cm0(i))
cmap = colors.ListedColormap(color_list0, 'indexed')
meb.tool.color_tools.show_cmap_clev(cmap)</code></pre>
<p><img src="https://www.showdoc.com.cn/server/api/attachment/visitfile/sign/d1bb308cbb5c7e5b2eea57369cf17cd8" alt="" /></p>
<p>tab10颜色区分度足够大,且颜色柔和耐看,通常能够满足绘图需求。但如果要绘制的数据legend超过10种,</p>
<pre><code class="language-python">#调用第1种方法生成颜色列表
colors_list = meb.tool.color_tools.get_seprated_rgb_method1(25)
cmap = colors.ListedColormap(colors_list, 'indexed')
meb.tool.color_tools.show_cmap_clev(cmap)</code></pre>
<p><img src="https://www.showdoc.com.cn/server/api/attachment/visitfile/sign/17850f2a3ac27cf7597c1c6aeaac190d" alt="" /></p>
<pre><code class="language-python">#调用第2种方法生成颜色列表
colors_list = meb.tool.color_tools.get_seprated_rgb_method2(25)
cmap = colors.ListedColormap(colors_list, 'indexed')
meb.tool.color_tools.show_cmap_clev(cmap)</code></pre>
<p><img src="https://www.showdoc.com.cn/server/api/attachment/visitfile/sign/49aaaea321c3a32c3fb671b1ccbd321a" alt="" /></p>
<h1>设置全局的颜色</h1>
<p>在检验系统研发中,可能要求在不同的检验图片中相同的模式预报保持相同的颜色,为此meb模块中提供了一个全局字典变量plot_color_dict来存储每一种legend名称对应的颜色。用户可以直接给该变量赋值,完成设置。但当legend种类较多时,可能就存在快速获取N种区分度较大的颜色的问题。</p>
<p><strong><font face="黑体" color=blue size = 3>set_plot_color_dict_method0(member_list):</font></strong><br />
采用matplotlib中的tab20方案依次设置全局字典变量,要求len(member_list)<=20。</p>
<p><strong><font face="黑体" color=blue size = 3>set_plot_color_dict_method1(member_list):</font></strong><br />
调用get_seprated_rgb_method1 生成 len(member_list)种颜色,并设置全局字典变量。</p>
<p><strong><font face="黑体" color=blue size = 3>set_plot_color_dict_method2(nmember_listum):</font></strong><br />
调用get_seprated_rgb_method2 生成 len(member_list)种颜色,并设置全局字典变量。</p>
<table>
<thead>
<tr>
<th style="text-align: left;">参数</th>
<th style="text-align: left;">说明</th>
</tr>
</thead>
<tbody>
<tr>
<td style="text-align: left;"><strong>member_list</strong></td>
<td style="text-align: left;">全局的legend名称,通常是模式名称、主观或客观方法或产品的名称</td>
</tr>
<tr>
<td style="text-align: left;"><font face="黑体" color=blue size=3>return</font></td>
<td style="text-align: left;">完成plot_color_dict赋值,无返回值</td>
</tr>
</tbody>
</table>
<p><strong>调用示例:</strong></p>
<pre><code class="language-python">#通过直接赋值的方法设置全局颜色字典
meb.plot_color_dict ={&quot;ECMWF&quot;:&quot;r&quot;,&quot;NCEP&quot;:&quot;y&quot;,&quot;CMA_GFS&quot;:&quot;g&quot;,&quot;CMA_MESO&quot;:&quot;b&quot;,
&quot;SCMOC&quot;:[0.5,0,0],&quot;SMERGE&quot;:[0,0.5,1]}</code></pre>
<p>从上面的示例可以看出,颜色既可以用字母表示,也可以用rgb表示。</p>
<pre><code class="language-python">meb.plot_color_dict</code></pre>
<pre><code>{'ECMWF': 'r',
'NCEP': 'y',
'CMA_GFS': 'g',
'CMA_MESO': 'b',
'SCMOC': [0.5, 0, 0],
'SMERGE': [0, 0.5, 1]}</code></pre>
<pre><code class="language-python">meber_list = [&quot;ECMWF&quot;,&quot;NCEP&quot;,&quot;CMA_GFS&quot;,&quot;CMA_MESO&quot;,&quot;SCMOC&quot;,&quot;SMERGE&quot;]
meb.tool.color_tools.set_plot_color_dict_method0(meber_list)
meb.plot_color_dict</code></pre>
<pre><code>{'ECMWF': (0.12156862745098039, 0.4666666666666667, 0.7058823529411765, 1.0),
'NCEP': (0.6823529411764706, 0.7803921568627451, 0.9098039215686274, 1.0),
'CMA_GFS': (1.0, 0.4980392156862745, 0.054901960784313725, 1.0),
'CMA_MESO': (1.0, 0.7333333333333333, 0.47058823529411764, 1.0),
'SCMOC': (0.17254901960784313, 0.6274509803921569, 0.17254901960784313, 1.0),
'SMERGE': (0.596078431372549, 0.8745098039215686, 0.5411764705882353, 1.0)}</code></pre>
<pre><code class="language-python">meber_list = [&quot;ECMWF&quot;,&quot;NCEP&quot;,&quot;CMA_GFS&quot;,&quot;CMA_MESO&quot;,&quot;SCMOC&quot;,&quot;SMERGE&quot;]
meb.tool.color_tools.set_plot_color_dict_method1(meber_list)
meb.plot_color_dict</code></pre>
<pre><code>{'ECMWF': (1.0, 0.0, 0.0),
'NCEP': (0.49126963509617466, 0.9956205099824267, 0.0),
'CMA_GFS': (0.19074488695547698, 0.3843245507804284, 0.261768793137952),
'CMA_MESO': (0.0, 0.4348461067609545, 0.5032341603237694),
'SCMOC': (0.49999999999999994, 0.25, 0.75),
'SMERGE': (0.8990295681937457, 0.22942638590314157, 1.0)}</code></pre>
<pre><code class="language-python">meb.tool.color_tools.set_plot_color_dict_method2(meber_list)
meb.plot_color_dict</code></pre>
<pre><code>{'ECMWF': (0.9305555555555556, 0.23611111111111116, 0.23611111111111116),
'NCEP': (0.6944444444444443, 0.6944444444444444, 0.13888888888888895),
'CMA_GFS': (0.125, 0.375, 0.125),
'CMA_MESO': (0.13888888888888895, 0.6944444444444443, 0.6944444444444444),
'SCMOC': (0.23611111111111116, 0.23611111111111116, 0.9305555555555556),
'SMERGE': (1.0, 0.5, 0.9999999999999999)}</code></pre>
<h1>图片cmap自动提取</h1>
<p>当我们需要在绘图中使用文献或其它资料中相同的colorbar时,以往常常需要使用颜色吸管吸取各等级的rgb值,然后用程序写成cmap,这个过程非常麻烦,为此开发了该功能。</p>
<p><strong><font face="黑体" color=blue size = 3>get_cmap_from_picture(png_path):</font></strong> </p>
<p>输入png文件,自动提取其中的colorbar的rgb值,组合成cmap。目前该算法仍然不成熟,可能出现提取失败的情况,返回结果中也不能区分colorbar中的尖头部分,更不能提取colorbar中的levels。</p>
<table>
<thead>
<tr>
<th style="text-align: left;">参数</th>
<th style="text-align: left;">说明</th>
</tr>
</thead>
<tbody>
<tr>
<td style="text-align: left;"><strong>png_path</strong></td>
<td style="text-align: left;">包含colorbar的png图片的路径</td>
</tr>
<tr>
<td style="text-align: left;"><strong>show</strong></td>
<td style="text-align: left;">是否以图形方式显示提取的结果</td>
</tr>
<tr>
<td style="text-align: left;"><font face="黑体" color=blue size=3>return</font></td>
<td style="text-align: left;">返回包含matplotlib的cmap变量的列表</td>
</tr>
</tbody>
</table>
<p><strong>调用示例:</strong></p>
<p>例如,在本地有一张包含两个colorbar的图片:
<img src="https://www.showdoc.com.cn/server/api/attachment/visitFile?sign=3975e7bb06b68350cf10e0002c641290" alt="" /></p>
<pre><code class="language-python">#通过get_cmap_from_picture函数提前其中的cmap
cmaps = meb.color_tools.get_cmap_from_picture(r&quot;H:\test_data\input\meb\cmap_identify_test.png&quot;,show=True)</code></pre>
<p><img src="https://www.showdoc.com.cn/server/api/attachment/visitFile?sign=2e9b8428c12d72e2c4c9e5f3b87131b9&amp;file=file.png" alt="" /></p>
<p><img src="https://www.showdoc.com.cn/server/api/attachment/visitFile?sign=4ec745fe6a3c38b960f70a9e07fb97e9&amp;file=file.png" alt="" /></p>
<pre><code class="language-python">#为了获取colorbar的完整配置,需手动设置clevs
clevs = [0,0.1,10,25,50,100,250,400,600,800]
meb.tool.color_tools.show_cmap_clev(cmaps[0],clev=clevs)</code></pre>
<p><img src="https://www.showdoc.com.cn/server/api/attachment/visitFile?sign=5baeb484f227230e53713a47da9f863b&amp;file=file.png" alt="" /></p>
<pre><code class="language-python"></code></pre>
<h1>将两个colorbar合并</h1>
<p><strong><font face="黑体" color=blue size = 3>merge_cmap_clevs(cmap0,clevs0,cmap1,clevs1):</font></strong> </p>
<p>将两个colorbar 合并</p>
<table>
<thead>
<tr>
<th style="text-align: left;">参数</th>
<th style="text-align: left;">说明(上述两个函数参数意义和用法完全相同)</th>
</tr>
</thead>
<tbody>
<tr>
<td style="text-align: left;"><strong>cmap0</strong></td>
<td style="text-align: left;">第0个colorbar的cmap,只支持matplotlib的cm对象,而不是能是字符串形式的cmap名称</td>
</tr>
<tr>
<td style="text-align: left;"><strong>clevs0</strong></td>
<td style="text-align: left;">第0个colorbar的clevs,只支持列表形式,不支持numpy数组形式</td>
</tr>
<tr>
<td style="text-align: left;"><strong>cmap1</strong></td>
<td style="text-align: left;">第1个colorbar的cmap,只支持matplotlib的cmap对象,而不是能是字符串形式的cmap名称</td>
</tr>
<tr>
<td style="text-align: left;"><strong>clevs1</strong></td>
<td style="text-align: left;">第1个colorbar的clevs,只支持列表形式,不支持numpy数组形式</td>
</tr>
<tr>
<td style="text-align: left;"><font face="黑体" color=blue size=3>return</font></td>
<td style="text-align: left;">元组,第一个元素为合并后matplotlib的cm对象, 第二个元素为合并后的clevs</td>
</tr>
</tbody>
</table>
<p><strong>调用示例:</strong></p>
<pre><code class="language-python">cmap0,clevs0 = meb.def_cmap_clevs(&quot;rainbow&quot;,np.arange(-10,0).tolist())
meb.tool.color_tools.show_cmap_clev(cmap0,clev=clevs0)
cmap1,clevs1 = meb.def_cmap_clevs(&quot;binary&quot;,np.arange(0,10).tolist())
meb.tool.color_tools.show_cmap_clev(cmap1,clev=clevs1)
cmap_merge,clevs_merge = meb.tool.color_tools.merge_cmap_clevs(cmap0,clevs0,cmap1,clevs1)
meb.tool.color_tools.show_cmap_clev(cmap_merge,clev=clevs_merge)</code></pre>
<p><img src="https://www.showdoc.com.cn/server/api/attachment/visitFile?sign=1b19a8b35f7ea10fac78a3ae12e76f7c&amp;file=file.png" alt="" /></p>
<p><img src="https://www.showdoc.com.cn/server/api/attachment/visitFile?sign=e017960f61b4118958545eccce75c890&amp;file=file.png" alt="" /></p>
<p><img src="https://www.showdoc.com.cn/server/api/attachment/visitFile?sign=367015c3df161140c13021633d9fd3c6&amp;file=file.png" alt="" /></p>