在 contourf 图中对一个级别使用不同的 cmap/color
Using a different cmap/color for one level in a contourf plot
我正在尝试使用一些 x
、y
和 z
值来绘制 matplotlib contourf
绘图。基本上 z
值将定义图的颜色。
然而,我现在所在的一个区域(即对我来说重要的区域)与其他区域相比非常小(见图),因此实际上很难看到这个特定区域(一些小的黑色 "dots").所以我在想是否有可能用另一种颜色获得第一个等级(或最后一个等级,因为在这种情况下它是负值),或者用细白线或其他东西勾勒出它的轮廓,这样人们就可以真正看到小而重要的点 ?
我正在用这段代码绘图:
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()
很抱歉没有提供任何真实数据,但我无法复制用于下图的数据(其中实际上有一些小的 amounts/dots 几乎是黑色的,在几乎黑色的内部(很奇怪sentence). 但是z
数据的大小和创建方式和上面一样。但是在从图中获取数据之前中间有很多计算。
根据您在下面的评论进行编辑:您可以将轮廓限制在您想要的 region/range 中。例如,我修改了上面示例代码中的 x、y 和 z 数据以绘制更多等高线。然后我 select 只有最高幅度的等高线 levels = sorted(level_list)[-5:]
(这里的最后 5 行)用红色突出显示。尝试为您的 actual 数据执行此操作,并查看感兴趣区域中的点是否可见。我在下面只写了我在你的代码中修改过的行。
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,))
输出
您可以根据现有颜色图创建自定义颜色图,然后将其中一种颜色替换为例如红色.
然后,您可以使用 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()
我正在尝试使用一些 x
、y
和 z
值来绘制 matplotlib contourf
绘图。基本上 z
值将定义图的颜色。
然而,我现在所在的一个区域(即对我来说重要的区域)与其他区域相比非常小(见图),因此实际上很难看到这个特定区域(一些小的黑色 "dots").所以我在想是否有可能用另一种颜色获得第一个等级(或最后一个等级,因为在这种情况下它是负值),或者用细白线或其他东西勾勒出它的轮廓,这样人们就可以真正看到小而重要的点 ?
我正在用这段代码绘图:
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()
很抱歉没有提供任何真实数据,但我无法复制用于下图的数据(其中实际上有一些小的 amounts/dots 几乎是黑色的,在几乎黑色的内部(很奇怪sentence). 但是z
数据的大小和创建方式和上面一样。但是在从图中获取数据之前中间有很多计算。
根据您在下面的评论进行编辑:您可以将轮廓限制在您想要的 region/range 中。例如,我修改了上面示例代码中的 x、y 和 z 数据以绘制更多等高线。然后我 select 只有最高幅度的等高线 levels = sorted(level_list)[-5:]
(这里的最后 5 行)用红色突出显示。尝试为您的 actual 数据执行此操作,并查看感兴趣区域中的点是否可见。我在下面只写了我在你的代码中修改过的行。
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,))
输出
您可以根据现有颜色图创建自定义颜色图,然后将其中一种颜色替换为例如红色.
然后,您可以使用 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()