我正在尝试使用一些contourf
,x
和y
值进行matplotlib z
绘制。基本上z
值将定义绘图的颜色。
但是,我现在所在的一个区域(即对我而言重要的区域)与其余区域相比很小(请参见图),因此实际上很难看到此特定区域(一些小黑点) )。因此,我在考虑是否有可能以另一种颜色获得第一个lvl(或最后一个级别,因为在这种情况下为负值),或者用细白线或其他东西勾勒出轮廓,以便使人真正看到较小的重要点?
我正在使用以下代码进行绘图:
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
数据的大小和创建方法与上面相同,但是在从图中获取数据之前,在这之间进行了许多计算。
答案 0 :(得分:1)
根据以下注释进行编辑:您可以将轮廓限制在所需的区域/范围内。例如,我修改了上面示例代码中的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,))
输出
答案 1 :(得分:1)
您可以基于现有的颜色表创建自定义颜色图,然后将其中一种颜色替换为例如红色。
然后,您可以使用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()