【问题标题】:How to set pivots on colorbar at customisable location in Matplotlib?如何在 Matplotlib 中的可自定义位置设置颜色条的枢轴?
【发布时间】:2013-09-25 13:28:41
【问题描述】:

我在使用 Matplotlib 颜色栏时遇到了一些麻烦,可能是我不理解文档(我不是以英语为母语的人)或其核心概念。

假设我有一个数据矩阵(形状,N*2)。我想制作这个数据的散点图,并添加一个基于标签列(N * 1)的配色方案,在浮点数中。我知道如何使用 colorbar 和 scalarmappable。

但是,我对此标签列中的一些枢轴值感兴趣,并且希望将这些值显示在颜色栏的某个有趣位置。例如,标签值为 0,我想将其放置在 1/3 位置或中间——在我选择的颜色栏中,它可以是白色或灰色。

但如果我理解正确的话,colorbar 只会从 [min, max] 中的原始数据中获取映射到 [0, 1] 中的数据数组。在这种情况下,我感兴趣的枢轴值最终会出现在某个随机位置,除非我非常仔细地定义了标准化函数。

所以要将我喜欢的白色作为我的枢轴值放在颜色条的中间,我必须定义标准化函数,它不仅可以标准化我的数据,而且还要使枢轴值位于 0.5 的位置.

对于我有限的 Matplotlib 经验,这是我知道的解决方案。

理想情况下,假设我有一列浮点数据,我可以选择一些枢轴值,并给它们一些特殊的位置。然后我将它们标准化并提供给颜色图。但是,颜色条可以为我之前定义的那些特殊位置设置特殊颜色。并获得一个带有正确刻度定位器和刻度标签的相应颜色条,指示我的特殊枢轴值。

我正在寻找一种更简单的方法(来自标准库),我可以使用它来实现这一目标。

【问题讨论】:

  • 我害怕编码一个特殊的颜色图和仔细的规范化函数。我想要有可伸缩的颜色图和多规范功能。我想知道是否有人能理解我...
  • 我会使用LinearSegmentedColormap matplotlib.org/api/… 这样您就可以将轴颜色放在您想要的任何位置。我会建议 trying 一些东西,然后编辑你的问题以包含代码。人们对代码的反应比对散文墙的反应更好(而且你的英语很好)。
  • 啊哈,我只是想知道我在这里多久能得到回复。是的,我知道线性段颜色图。这是我要做的最后一件事,因为 matplotlib 中已经有一组可用的颜色条,但我只是想让它伸展,以便我可以在那里定位我的枢轴值。我希望使用 colorbrewer 颜色图。不管怎么说,还是要谢谢你。我马上给linearsegmap打码。

标签: python matplotlib normalization colorbar


【解决方案1】:

如果您可以发布您想要制作的情节,这将非常有帮助。但根据我的理解,您只想在一个或多个特定位置对颜色条做一些事情。这很简单,下面的案例展示了一个在0.5处写一个文本字符串的例子。

x1=np.random.random(1000)
x2=np.random.random(1000)
x3=np.random.random(1000)
plt.scatter(x1, x2, c=x3, marker='+')
cb=plt.colorbar()
color_norm=lambda x: (x-cb.vmin)/(cb.vmax-cb.vmin)
cb.ax.text(0.5, color_norm(0.5), 'Do something.\nRight here', color='r')

如果您想在颜色条的 1/3 高度处获得值 0.5,则需要使用 cb.set_clim((cmin, cmax)) 方法调整颜色条限制。 (cmin, cmax) 将有无限可能满足您的需求,因此需要额外的约束,例如保持最小值不变或保持最大值不变或保持最大值-最小值不变。

【讨论】:

  • 是的,这是我想要的一部分,通过定位功能在刻度位置做一些事情。但现在还没有。我们怎样才能使颜色条被拉伸?比如,RdYIGn,用黄色代替 1/3 的位置,整个颜色图被拉伸以适应 (nbviewer.ipython.org/5357268)。我想我可能想制作一个辅助函数来拉伸那些预定义的颜色图,可能来自 [0, pivot1, pivot2, pivot3,..., 1] 数组。感谢您的答复。 :)
  • 主要问题是,,,由于我的语言能力,我不知道如何描述我的问题。再看我的标题,伙计,这正是你所回答的。
  • RdYiGn 中的黄色为 0.5,您想将其更改为 0.3333,同时保持最大值仍为深绿色吗?也就是说,拉伸任何高于 0.5 的内容并压缩任何低于 0.5 的内容?如果没有LinearSegmentedColormap @tcaswell 的建议,我认为您无法有效地做到这一点。按照这个例子:matplotlib.org/examples/pylab_examples/custom_cmap.html
猜你喜欢
  • 2020-03-10
  • 2021-09-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-02-02
  • 2011-03-03
  • 2015-09-29
  • 1970-01-01
相关资源
最近更新 更多