首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Matplotlib自定义发散渐变忽略颜色

Matplotlib自定义发散渐变忽略颜色
EN

Stack Overflow用户
提问于 2017-08-24 08:49:03
回答 1查看 1.1K关注 0票数 2

我一直在为python开发一些数据绘图功能,我的研究需要的一个这样的工具是一组差异图表,用于比较两组数据之间的变化。

我现在想要绘制我的数据,我正在考虑创建自定义颜色映射来处理不同的数据,但是到目前为止,我的所有绘制要么忽略了渐变中的特定步骤,要么为我的低值重复了颜色。

下面是一个生成的示例图:

以及我的自定义颜色映射和绘图的代码:

代码语言:javascript
运行
复制
diffmap_17 = ["#FF0000", "#F81318", "#F12731", "#EB3B4A", "#EB5C66", "#EB7D82", "#EB9E9E", "#F1BEBE", "#F8DEDE", "#FFFFFF", "#DDDCFD", "#BCB9FB", "#9B96FA", "#6A6CFA", "#3A43FA", "#1D21FC", "#0000FF"]
diffmap_17_colormap = matplotlib.colors.ListedColormap(diffmap_17)

contour_levels = [-20, -10, -5, -2, -1, -0.75, -0.5, -0.25, -0.1, 0.0, 0.1, 0.25, 0.5, 0.75, 1, 2, 5, 10, 20]
cs = m.contourf(x,y,data,contour_levels,cmap=diffmap_17_colormap) #plot total

我的目标是让颜色图的零点是白色的,然后向外发散(红色为负,蓝色为正)。目前,我使用标准的颜色映射,但是使用自定义的颜色映射会更好。

任何帮助都将不胜感激。谢谢!

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-08-24 17:53:05

问题是,通过将最小值和最大值之间的范围划分为相等的部分,从色彩映射表中选择颜色。由于大多数级别彼此非常接近,它们落入相同的范围,因此具有相同的颜色。

最简单的解决方案不是使用色彩映射表,而是使用一个图,其中每个级别都从colorlist中获取其颜色。在这种情况下,您可以将颜色列表直接提供给contourf绘图。

代码语言:javascript
运行
复制
plt.contourf(x,y,data,contour_levels,colors=diffmap_17)

注意,因为你有19个级别,所以你的列表需要18种颜色(因此我增加了一种颜色)。

代码语言:javascript
运行
复制
import matplotlib.pyplot as plt
import numpy as np
import matplotlib.colors

x, y= np.meshgrid(np.linspace(-3,3), np.linspace(-3,3))
r = np.sqrt(x**2+y**2)
data = np.tan((r*0.7-1.5))*1.3

diffmap_17 = ["#FF0000", "#F81318", "#F12731", "#EB3B4A", "#EB5C66", "#EB7D82", 
              "#EB9E9E", "#F1BEBE", "#F8DEDE", "#FFFFFF", "#DDDCFD", "#BCB9FB", 
              "#9B96FA", "#6A6CFA", "#3A43FA", "#1D21FC", "#0000FF", "#0000ce"]

contour_levels = [-20, -10, -5, -2, -1, -0.75, -0.5, -0.25, -0.1, 0.0, 
                  0.1, 0.25, 0.5, 0.75, 1, 2, 5, 10, 20]
cs = plt.contourf(x,y,data,contour_levels,colors=diffmap_17)

plt.colorbar(cs)

plt.show()

如果要使用色彩映射表,则需要提供一个规范化实例和色彩映射表。matplotlib.colors.BoundaryNorm将根据提供给它的边界列表选择颜色,该列表将是等高线图的级别列表。

代码语言:javascript
运行
复制
import matplotlib.pyplot as plt
import numpy as np
import matplotlib.colors

x, y= np.meshgrid(np.linspace(-3,3), np.linspace(-3,3))
r = np.sqrt(x**2+y**2)
data = np.tan((r*0.7-1.5))*1.3

diffmap_17 = ["#FF0000", "#F81318", "#F12731", "#EB3B4A", "#EB5C66", "#EB7D82", 
              "#EB9E9E", "#F1BEBE", "#F8DEDE", "#FFFFFF", "#DDDCFD", "#BCB9FB", 
              "#9B96FA", "#6A6CFA", "#3A43FA", "#1D21FC", "#0000FF", "#0000ce"]
diffmap_17_colormap = matplotlib.colors.ListedColormap(diffmap_17)

contour_levels = [-20, -10, -5, -2, -1, -0.75, -0.5, -0.25, -0.1, 0.0, 
                  0.1, 0.25, 0.5, 0.75, 1, 2, 5, 10, 20]
norm = matplotlib.colors.BoundaryNorm(contour_levels, diffmap_17_colormap.N)
cs = plt.contourf(x,y,data,contour_levels,cmap=diffmap_17_colormap, norm=norm)

plt.colorbar(cs)

plt.show()

输出图与上面相同。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/45851287

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档