Python 不同绘图的相同颜色栏范围-Matplotlib

Python 不同绘图的相同颜色栏范围-Matplotlib,python,matplotlib,range,colorbar,Python,Matplotlib,Range,Colorbar,我正在努力通过不同的绘图保持相同的颜色条范围 例如,我有以下可视化: 使用此代码生成的: def plot_contour(x_dim, y_dim, x_steps, y_steps, scalar_field, file_path): plt.figure() x, y = numpy.mgrid[-x_dim:x_dim/:x_steps*1j, -y_dim:y_dim:y_steps*1j] cs = plt.contourf(x, y, scalar_

我正在努力通过不同的绘图保持相同的颜色条范围

例如,我有以下可视化:

使用此代码生成的:

def plot_contour(x_dim, y_dim, x_steps, y_steps, scalar_field, file_path):
    plt.figure()

    x, y = numpy.mgrid[-x_dim:x_dim/:x_steps*1j, -y_dim:y_dim:y_steps*1j] 
    cs = plt.contourf(x, y, scalar_field, zorder=1, extent=[-x_dim, x_dim, -y_dim, y_dim])
    plt.colorbar(cs)

    plt.savefig(file_path + '.png', dpi=Vc.dpi)
    plt.close()
我希望能够比较这两个字段,因此,我希望对它们使用相同的颜色映射

我的第一种方法是使用参数
v_min
v_max
,使用数据的最小/最大值

cs = plt.contourf(x, y, scalar_field, zorder=1, extent=[-x_dim, x_dim, -y_dim, y_dim], vmin=-1.00, vmax=1.05) # Manual setting to test
然后我得到了相同的颜色映射:

但我也希望在绘图中显示相同的颜色栏范围。我试着用

cb = plt.colorbar(cs)
cb.set_clim(vmin=-1.00, vmax=1.05)
没有成功

此完整示例产生相同的行为:

import matplotlib
import numpy as numpy
import matplotlib.cm as cm
import matplotlib.mlab as mlab
import matplotlib.pyplot as plt

matplotlib.rcParams['xtick.direction'] = 'out'
matplotlib.rcParams['ytick.direction'] = 'out'

delta = 0.025
x = numpy.arange(-3.0, 3.0, delta)
y = numpy.arange(-2.0, 2.0, delta)
X, Y = numpy.meshgrid(x, y)

Z1 = mlab.bivariate_normal(X, Y, 1.0, 1.0, 0.0, 0.0)
Z2 = mlab.bivariate_normal(X, Y, 1.5, 0.5, 1, 1)
# difference of Gaussians

Za = 10.0 * (Z2 - Z1)
Zb = 5.0 * (Z2 - Z1)

def bounds(scalar_fields):
    """
    Get the bounds of a set of scalar_fields
    :param scalar_fields : the scalar field set
    :return: a set of normalized vector field components
    """
    max_bound = -numpy.inf
    min_bound = numpy.inf

    for scalar_field in scalar_fields:
        max_lim = numpy.max(scalar_field)
        min_lim = numpy.min(scalar_field)
        if max_lim > max_bound:
            max_bound = max_lim
        if min_lim < min_bound:
            min_bound = min_lim

    return min_bound, max_bound

def plot_contour(x_dim, y_dim, x_steps, y_steps, scalar_field, v_min, v_max, file_path):
    plt.figure()

    x, y = numpy.mgrid[-x_dim/2:x_dim/2:x_steps*1j, -y_dim/2:y_dim/2:y_steps*1j]

    cs = plt.contourf(x, y, scalar_field, zorder=1, extent=[-x_dim/2.0, x_dim/2.0, -y_dim/2.0, y_dim/2.0],
                      vmin=v_min, vmax=v_max)
    cb = plt.colorbar(cs)

    plt.savefig(file_path + '.png')
    plt.close()

v_min, v_max = bounds([Za, Zb])
x_dim = y_dim = 6

y_steps = x.shape[0]
x_steps = y.shape[0]    

plot_contour(x_dim, y_dim, x_steps, y_steps, Za, v_min, v_max, 'Za')
plot_contour(x_dim, y_dim, x_steps, y_steps, Zb, v_min, v_max, 'Zb') 
导入matplotlib
将numpy作为numpy导入
将matplotlib.cm导入为cm
将matplotlib.mlab导入为mlab
将matplotlib.pyplot作为plt导入
matplotlib.rcParams['xtick.direction']='out'
matplotlib.rcParams['ytick.direction']='out'
增量=0.025
x=numpy.arange(-3.0,3.0,delta)
y=numpy.arange(-2.0,2.0,delta)
十、 Y=numpy.meshgrid(X,Y)
Z1=mlab.二元_正态(X,Y,1.0,1.0,0.0,0.0)
Z2=mlab.二元正态(X,Y,1.5,0.5,1,1)
#高斯差分
Za=10.0*(Z2-Z1)
Zb=5.0*(Z2-Z1)
定义界限(标量_字段):
"""
获取一组标量_字段的边界
:param scalar_fields:标量字段集
:return:一组规范化的向量场组件
"""
max_bound=-numpy.inf
min_bound=numpy.inf
对于标量_字段中的标量_字段:
max\u lim=numpy.max(标量字段)
min\u lim=numpy.min(标量字段)
如果最大极限>最大极限:
最大界限=最大界限
如果最小极限<最小极限:
最小界限=最小界限
返回最小界,最大界
def plot_轮廓(x_尺寸、y_尺寸、x_步长、y_步长、标量_字段、v_最小值、v_最大值、文件路径):
plt.图()
x、 y=numpy.mgrid[-x_dim/2:x_dim/2:x_steps*1j,-y_dim/2:y_steps*1j]
cs=plt.contourf(x,y,标量场,zorder=1,范围=[-x_dim/2.0,x_dim/2.0,-y_dim/2.0,y_dim/2.0],
vmin=v_最小值,vmax=v_最大值)
cb=plt.色条(cs)
plt.savefig(文件路径+'.png')
plt.close()
v_min,v_max=边界([Za,Zb])
x_尺寸=y_尺寸=6
y_步数=x.shape[0]
x_步数=y.shape[0]
绘制等高线(x_尺寸,y_尺寸,x_步数,y_步数,Za,v_最小值,v_最大值,'Za')
绘制等高线(x_尺寸,y_尺寸,x_步数,y_步数,Zb,v_最小值,v_最大值,'Zb')
我怎么能这么做


提前感谢。

如果您希望颜色栏中的颜色对应于两个等高线图中的相同值,那么您不仅需要控制颜色栏,还需要控制等高线图中的级别。也就是说,要比较图之间的相同标高,图应具有相同的等高线标高。这很容易做到。下面是该图的一个示例:

有两种方法:1)提前计算水平;2) 使用一个图中的标高设置另一个图中的标高。我将做第二个,因为从这里应该清楚如何做第一个(使用,例如,
levels=numpy.linspace(v_min,vmax,10)
,但是,要明确的是,我这里不使用这个,而是让mpl计算级别)

首先,这里我还使用:

Za = 10.0 * (Z2 - Z1)
Zb = 6.0 * (Z2 - Z1)   # 6, rather than 5
然后,绘制:

def plot_contour(x_dim, y_dim, x_steps, y_steps, scalar_field, file_path, v_min, v_max, levels=None):
    x, y = numpy.mgrid[-x_dim/2:x_dim/2:x_steps*1j, -y_dim/2:y_dim/2:y_steps*1j]
    cs = plt.contourf(x, y, scalar_field, zorder=1, cmap=cm.jet, extent=[-x_dim/2.0, x_dim/2.0, -y_dim/2.0, y_dim/2.0], vmin=v_min, vmax=v_max, levels=levels)
    plt.colorbar(cs)
    return cs.levels

v_min, v_max = bounds([Za, Zb])

plt.figure()
plt.subplot(121)
levels = plot_contour(x_dim, y_dim, x_steps, y_steps, Za, 'Za', v_min, v_max)
plt.subplot(122)
plot_contour(x_dim, y_dim, x_steps, y_steps, Zb, 'Zb', v_min, v_max, levels=levels) 
plt.show()

vmin
vmax
放在两个调用上?你所做的应该有用。你能在一个完整的可调用示例(包括合成数据)中重现这个吗?是的,我在两个调用中都使用了这个参数,函数是相同的。我会这样做。我认为
set\u clim
应该在
cs
对象上,而不是在颜色栏上。所以在这个例子中它不能是5?一个绘图的最小、最大级别应理解另一个绘图的限制?我对数据没有这样的控制权,它们来自预测,如果我提到的条件是必要的,通过我的集合,这将不会是真的/不,这只是一个使用一组级别的示例。您可以根据需要指定级别,也可以将
levels=np.arange(-5,6)
传递给两者。主要的一点是,如果您想要两个离散化的色条匹配级别(当然,这些级别也匹配轮廓),那么级别本身必须匹配。Ok。我在这里试试,接受你的回答。谢谢你,@tom10。没问题,如果它基本上不能满足你的要求,就没有必要接受它。它确实做到了。)再次谢谢你。