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

编程入门 行业动态 更新时间:2024-10-25 22:23:49
本文介绍了如何在 matplotlib 中仅使用和绘制颜色条的一部分?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧! 问题描述

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

I have multiple curves that differ in one parameter and which I want to plot in one figure. To distinguish them, I want to use one of matplotlib's colorbars. To do so I produce a list of colors depending on said parameter. Additionally, I want to add a colorbar to explain the colors that are used. I can easily do all of that. The problem is now, that I want to use only a part of the available colormap, as it gets too bright and thus barely visible above some threshold. But when I now choose the colors only in a subrange, I did not find a way to adjust the range of the displayed colorbar.

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

Here is a (nearly) minimal example of what I want to achieve:

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.但如果我只是通过添加行 ax[0].set_xlim(0, maxColor),颜色部分调整正确,但是周围的框乱了:

I now want the colorbar to stop at 10. But if I just adjust the xlim of the subplot by adding the line ax[0].set_xlim(0, maxColor), the colored part is adjusted correctly, but the surrounding box is messed up:

或者,我找到了一个颜色条 set_clim 的函数.但这只会改变规范化,似乎并没有像我想要的那样工作.添加 cb.set_clim(parameterToColorBy [0],parameterToColorBy [-1])会导致颜色更改但轴不变:

Alternatively, I found a function for colorbars set_clim. But this only changes the normalization and does not seem to work as I want. Adding cb.set_clim(parameterToColorBy[0], parameterToColorBy[-1]) results in an changed colors but unchanged axis:

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

What I seem to need is either an appropriate way to adjust the limits of the displayed colorbar, or a way to create an own colorbar as a subset of an available colorbar. Is there any way to achieve one of these things?

推荐答案

您可以使用我在下面的代码中编写的 truncate_colormap 函数来截断颜色图.它将根据现有的颜色图创建一个新的 matplotlib.colors.LinearSegmentedColormap .

You can truncate the colormap by using the truncate_colormap function I have written in the code below. It creates a new matplotlib.colors.LinearSegmentedColormap from an existing colormap.

请注意,您不需要通过 maxColor 缩放 Normalise 实例,并且在创建 colors 列表和 colorbar.

Note that you then don't need to scale the Normalise instance by maxColor, and you need to use this new colormap instance when creating your colors list and the 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()

更多推荐

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

本文发布于:2023-07-18 12:56:21,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/1145010.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:颜色   如何在   matplotlib

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!