在contourf p中为一个级别使用不同的cmap/颜色

2024-09-30 22:21:48 发布

您现在位置:Python中文网/ 问答频道 /正文

我试图用一些xy和{}值绘制matplotlibcontourf图。基本上,z值将定义绘图的颜色。 然而,我现在所处的一个区域(即对我来说重要的区域)与其他区域相比非常小(见图),所以很难看到这个特定区域(一些小的黑色“点”)。所以我在想,是否可以用另一种颜色来获得第一个级别(或者最后一个级别,因为在这个例子中它是负值),或者用一条细白线或者其他什么来勾勒它,这样人们就可以真正地看到小而重要的点了?在

我用这个代码来绘制:

import matplotlib.pyplot as plt
from matplotlib import rcParams
import matplotlib.colors as colors
import numpy as np

nx = 41
ny = 67

x = np.linspace(0.01, 1, nx)
y = np.linspace(0.01, 2, ny)
x_bc = x[:, np.newaxis]
y_bc = y[np.newaxis, :]

z = x_bc*y_bc

max_value = np.amax(z)
cmapp = plt.get_cmap('Greys')

level_intervals = [100, 90, 80, 70, 60, 50, 40, 30, 20, 10, 8, 1.92, 0]
level_list = [max_value-i for i in level_intervals]

col_bar = plt.contourf(x, y, z.T, level_list, cmap=cmapp)
plt.xlabel('x')
plt.ylabel('y')
plt.colorbar(col_bar, cmap=cmapp)

plt.show()

我很抱歉没有提供任何真实的数据,但是我不能复制下面的图中使用的数据(在几乎黑色的部分里,实际上有一些小数量的几乎黑色的点,在几乎黑色的句子中)。但是,创建z数据的大小和方式与上面一样。然而,在从图中得到数据之前,有很多计算工作要做。在

enter image description here


Tags: 数据import区域matplotlib颜色asnp绘制
2条回答

您可以基于现有颜色创建自定义颜色映射,并将其中一种颜色替换为红色。
然后可以使用BoundaryNorm将新颜色映射中的颜色用于指定级别。在

import numpy as np
import matplotlib.pyplot as plt
import matplotlib.colors

d = np.linspace(-3,3)
x,y = np.meshgrid(d,d)
data = -585.22 + 94*np.exp(-(x**2+y**2))
levels = np.linspace(-585.22, -485.22, 13)
norm = matplotlib.colors.BoundaryNorm(levels,len(levels))

colors = list(plt.cm.Greys(np.linspace(0,1,len(levels)-1)))
colors[-1] = "red"
cmap = matplotlib.colors.ListedColormap(colors,"", len(colors))

im = plt.contourf(data, levels, cmap=cmap, norm=norm)

plt.colorbar(ticks=levels)

plt.show()

enter image description here

根据您在下面的注释进行编辑:您可以在所需的区域/范围内限制轮廓。例如,我修改了上面示例代码中的x、y和z数据以绘制更多的等高线。然后我只选择最高幅度的轮廓线levels = sorted(level_list)[-5:](这里最后5行)用红色高亮显示。尝试对您的实际数据执行此操作,并查看感兴趣区域中的点是否可见。我在下面写的只是我在你的代码中修改过的行。在

fig = plt.figure(figsize=(8, 6))
nx = 67
ny = 77

# Modified your actual values to get some more contour lines
x = np.linspace(1, 16, nx)
y = np.linspace(1, 15, ny)
z = x_bc*y_bc*0.2

col_bar = plt.contourf(x, y, z.T, level_list, cmap=cmapp)
plt.contour(col_bar, levels = sorted(level_list)[-5:], colors=('r',),linestyles=('-',),linewidths=(3,))

输出

enter image description here

相关问题 更多 >