Python 扩展colorbar以包含超出范围的数据

Python 扩展colorbar以包含超出范围的数据,python,matplotlib,colorbar,colormap,Python,Matplotlib,Colorbar,Colormap,我试着用下面的代码制作极地热图 # Plotting the polar plot from matplotlib.colorbar import ColorbarBase from matplotlib.colors import LogNorm import matplotlib.pyplot as plt cmap = obspy_sequential # Have defined the variables to be used for pointing to the coordi

我试着用下面的代码制作极地热图

# Plotting the polar plot 
from matplotlib.colorbar import ColorbarBase
from matplotlib.colors import LogNorm
import matplotlib.pyplot as plt
cmap = obspy_sequential 

# Have defined the variables to be used for pointing to the coordinates 
# baz is angular, slow is radial, abs_power is the value at every co-ordinate
# Choose number of fractions in plot (desirably 360 degree/N is an integer!)
N = 72
N2 = 30
abins = np.arange(N + 1) * 360. / N
sbins = np.linspace(0, 3, N2 + 1)

# Sum rel power in bins given by abins and sbins
hist, baz_edges, sl_edges = \
    np.histogram2d(baz, slow, bins=[abins, sbins], weights=abs_power)

# Transform to radian
baz_edges = np.radians(baz_edges)

# Add polar and colorbar axes
fig = plt.figure(figsize=(8, 8))
cax = fig.add_axes([0.85, 0.2, 0.05, 0.5])
ax = fig.add_axes([0.10, 0.1, 0.70, 0.7], polar=True)
ax.set_theta_direction(-1)
ax.set_theta_zero_location("N")

dh = abs(sl_edges[1] - sl_edges[0])
dw = abs(baz_edges[1] - baz_edges[0])

# Circle through backazimuth
for i, row in enumerate(hist):
    bars = ax.bar((i * dw) * np.ones(N2),
                  height=dh * np.ones(N2),
                  width=dw, bottom=dh * np.arange(N2),color=cmap(row / hist.max()))

ax.set_xticks(np.linspace(0, 2 * np.pi, 10, endpoint=False))
ax.set_yticklabels(velocity)
ax.set_ylim(0, 3)
[i.set_color('white') for i in ax.get_yticklabels()]
ColorbarBase(cax, cmap=cmap,
             norm=LogNorm(vmin=hist.min(),vmax=hist.max()))
plt.show()
我正在创建这样的多个绘图,因此我需要将颜色条的范围扩展到abs_power数据范围的最大范围之外。 我尝试将vmax和vmin更改为我想要的最大最小目标数,但每次它都绘制出完全相同的图。颜色栏上的最大值不断变化,但绘图不变。为什么会这样? 这是它的样子



这里的实际最大功率远小于色条中指定的最大功率。仍然可以看到一个明亮的黄色斑点。
PS:对于我提供的任何vmax、vmin值,我都会得到相同的绘图。

更改颜色栏不会对主绘图产生影响。您需要更改
color=cmap(row/hist.max())
中使用的公式才能更改条形图。“规范”就是为了完成这项任务。范数将数字范围映射到间隔
[0,1]
。映射到大于1的值的每个值(即,在本例中大于
hist.max()
的值)都会被指定最高颜色

要使颜色栏反映正确的信息,绘图和颜色栏需要相同的cmap和相同的规范:

my_norm = LogNorm(vmin=hist.min(),vmax=hist.max())
for i, row in enumerate(hist):
    bars = ax.bar((i * dw) * np.ones(N2),
                  height=dh * np.ones(N2),
                  width=dw, bottom=dh * np.arange(N2),color=cmap(my_norm(row)))

另一方面,如果不想显示黄色,可以在上面的代码中尝试类似于
my_norm=LogNorm(vmin=hist.min(),vmax=hist.max()*100)

使用标准的
plt.colorbar()
,但使用指示所用颜色映射和规范的
ScalarMappable
,而不是通过
colorbase
创建颜色条。如果是
LogNorm
,这将以日志格式显示刻度

from matplotlib.cm import ScalarMappable
plt.colorbar(ScalarMappable(cmap=cmap, norm=my_norm), ax=ax, cax=cax)

完美的非常感谢你!我也有很多负值(对数小于1)。代码表示不能接受vmin的负值。在这种情况下应该怎么做?最好使用matplotlib.cm中的
导入ScalarMapable
plt.colorbar(ScalarMapable(cmap=cmap,norm=my_norm),ax=ax,cax=cax)而不是
colorbar
。这样,颜色栏上的记号也将使用对数
vmin
LogNorm(vmin=…,…)
中必须是正数,但可以是
0.000001
,因此将显示负的日志值
from matplotlib.cm import ScalarMappable
plt.colorbar(ScalarMappable(cmap=cmap, norm=my_norm), ax=ax, cax=cax)