如何仅使用和绘制颜色条的一部分?

问题描述 投票:0回答:1

我有多条曲线,它们的一个参数不同,并且我想将其绘制在一张图中。为了区分它们,我想使用 matplotlib 的颜色条之一。为此,我根据所述参数生成一个颜色列表。此外,我想添加一个颜色条来解释所使用的颜色。我可以轻松做到这一切。现在的问题是,我只想使用可用颜色图的一部分,因为它变得太亮,因此在高于某个阈值时几乎不可见。但是,当我现在仅在子范围中选择颜色时,我没有找到调整显示颜色条范围的方法。

这是我想要实现的目标的(几乎)最小示例:

import numpy as np
import matplotlib as mpl
import matplotlib.pyplot as plt
import matplotlib.gridspec as gridspec

gs = gridspec.GridSpec(2, 1,
                       height_ratios=[1, 4]
                       )
ax = [plt.subplot(g) for g in gs]

parameterToColorBy = np.linspace(5, 10, 6, dtype=float)

maxColor = 0.85
colors = [plt.get_cmap("inferno")(i)
          for i in np.linspace(0, maxColor, parameterToColorBy.shape[0])]

norm = mpl.colors.Normalize(parameterToColorBy[0],
                            parameterToColorBy[0]+
                            (parameterToColorBy[-1]-parameterToColorBy[0])/
                            maxColor)
cb = mpl.colorbar.ColorbarBase(ax[0],
                               cmap="inferno",
                               norm=norm,
                               ticks=parameterToColorBy,
                               orientation='horizontal')
ax[0].xaxis.set_ticks_position('top')

for p, c in zip(parameterToColorBy, colors):
    ax[1].plot(np.arange(2)/p, c=c)

plt.show()

结果如下:

我现在希望颜色条停止在 10。但是如果我只是通过添加行

xlim
来调整子图的
ax[0].set_xlim(0, maxColor)
,则彩色部分调整正确,但周围的框弄乱了:

或者,我找到了一个用于颜色条的函数

set_clim
。但这只会改变规范化,并且似乎没有按照我想要的方式工作。添加
cb.set_clim(parameterToColorBy[0], parameterToColorBy[-1])
会导致颜色更改但轴不变:

我似乎需要的是一种调整显示颜色条限制的适当方法,或者一种创建自己的颜色条作为可用颜色条的子集的方法。有什么办法可以实现其中之一吗?

python matplotlib colorbar
1个回答
9
投票

您可以使用我在下面的代码中编写的

truncate_colormap
函数截断颜色图。它从现有的颜色图创建一个新的
matplotlib.colors.LinearSegmentedColormap

请注意,您不需要将

Normalise
实例缩放
maxColor
,并且在创建
colors
列表和
colorbar
时需要使用这个新的颜色图实例。

import numpy as np
import matplotlib as mpl
import matplotlib.pyplot as plt
import matplotlib.gridspec as gridspec
import matplotlib.colors as mcolors

gs = gridspec.GridSpec(2, 1,
                       height_ratios=[1, 4]
                       )
ax = [plt.subplot(g) for g in gs]

parameterToColorBy = np.linspace(5, 10, 6, dtype=float)

def truncate_colormap(cmap, minval=0.0, maxval=1.0, n=-1):
    if n == -1:
        n = cmap.N
    new_cmap = mcolors.LinearSegmentedColormap.from_list(
         'trunc({name},{a:.2f},{b:.2f})'.format(name=cmap.name, a=minval, b=maxval),
         cmap(np.linspace(minval, maxval, n)))
    return new_cmap

minColor = 0.00
maxColor = 0.85
inferno_t = truncate_colormap(plt.get_cmap("inferno"), minColor, maxColor)

colors = [inferno_t(i)
          for i in np.linspace(0, 1, parameterToColorBy.shape[0])]

norm = mpl.colors.Normalize(parameterToColorBy[0],
                            parameterToColorBy[-1])

cb = mpl.colorbar.ColorbarBase(ax[0],
                               cmap=inferno_t,
                               norm=norm,
                               ticks=parameterToColorBy,
                               orientation='horizontal')

ax[0].xaxis.set_ticks_position('top')

for p, c in zip(parameterToColorBy, colors):
    ax[1].plot(np.arange(2)/p, c=c)

plt.show()

© www.soinside.com 2019 - 2024. All rights reserved.