我一直在研究Python的一些数据绘图功能,我的研究需要的一个这样的工具是一组差异图表来比较两组数据之间的变化。
我现在想要绘制数据,并且正在考虑创建自定义颜色图来处理发散的数据,但是到目前为止,我的所有绘图要么忽略渐变中的特定步骤,要么忽略对于我的低值,颜色被重复。
以及我的自定义颜色图和绘图的代码:
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
我的目标是让颜色图的零点为白色,然后向外发散(红色为负,蓝色为正)。目前,我正在使用标准颜色图,但以后最好使用自定义颜色图。
任何帮助将不胜感激。谢谢!
最佳答案
问题在于,颜色是通过将最小值和最大值之间的范围分成相等的部分来从颜色图中选择的。由于大多数级别彼此非常接近,因此它们属于相同的范围,因此具有相同的颜色。
最简单的解决方案不是使用颜色图,而是使用每个级别从颜色列表中获取其颜色的绘图。在这种情况下,您可以直接向轮廓图提供颜色列表。
plt.contourf(x,y,data,contour_levels,colors=diffmap_17)
请注意,由于您有 19 个级别,因此您的列表将需要 18 种颜色(因此我添加了一种颜色)。
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 将根据提供给它的边界列表选择颜色,这将是等高线图的级别列表。
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()
输出图与上面相同。
关于python - Matplotlib自定义发散梯度忽略颜色,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45851287/