在matplotlib colorbar中对刻度标签进行对齐

10

我有一个彩条,其中包含正负值,这些值是自动生成的(我没有设置它们)。 不幸的是,减号破坏了文本的垂直对齐。 如何将刻度标签中的所有文本右对齐,或者在正数前插入一个空格使其看起来好看?

enter image description here


我不知道为什么之前错过了这个问题,我已经多次彻底搜索了类似的内容。看起来这是我们想要做的一件如此简单和自然的事情... 这需要更多的赞;) - Andras Deak -- Слава Україні
4个回答

5
您可以更改文本的对齐方式。为了避免与色标重叠,可能需要稍微更改标签的(x)位置。
a = np.random.randn(10,10)

fig, ax = plt.subplots()

im = ax.imshow(a, interpolation='none')
cb = plt.colorbar(im)

for t in cb.ax.get_yticklabels():
    t.set_horizontalalignment('right')   
    t.set_x(3.5)

enter image description here


我想告诉你,我找到了一个稍微不同的解决方案,更能适应变化的窗口大小。我主要留下这个评论是为了询问你是否在过去的两年中发现了更好的解决方法。 - Andras Deak -- Слава Україні

4

我正要问同样的问题,最后找到了你的答案。因此,我想补充我的解决方法。

起初我使用了与Rutger Kassies提供的完全相同的解决方案。然而,在ipython中绘图时,当在小窗口查看或将图形设置为全屏时,相同数量的x位置偏移会给出截然不同的结果。

最终,我选择了设置色条的刻度标签的pad。 冒失地偷走了Rutger的示例代码:

a = np.random.randn(10,10)

fig, ax = plt.subplots()

im = ax.imshow(a, interpolation='none')
cb = plt.colorbar(im)

ticklabs = cb.ax.get_yticklabels()
cb.ax.set_yticklabels(ticklabs,ha='right')
cb.ax.yaxis.set_tick_params(pad=45)  # your number may vary

这种解决方法在不同的窗口大小和宽高比下都能得到更一致的结果。
以下是4个输出,以演示我的意思:顶行为位移解决方案,底行为填充解决方案。左侧为默认的图形窗口大小,右侧是在将图形窗口弹出至全屏后进行保存:top row older solution, bottom row is mine

2

在创建色条时,使用“格式”选项最为简单。

import numpy as np
import matplotlib.pyplot as plt

a = np.random.randn(10,10)

fig, ax = plt.subplots()

im = ax.imshow(a, interpolation='none')

colorbar_format = '% 1.1f'
cb = plt.colorbar(im, format=colorbar_format)

基本上,您可以使用Python的“%”字符串格式。具体内容请参考https://pyformat.info/ 如果您知道您有负数,请注意在%后面多加一个空格,这将为正数添加一个空格,而对于负数则不会添加任何内容。您可能需要尝试一下,以找到最适合您用例的方法。我还注意到,如果您没有设置自己的刻度值:
cb = plt.colorbar(im, ticks=your_own_ticks, format=colorbar_format)

使用不同的格式可能会改变蜱的数量和分布。 在绘图颜色条标签中使用格式化字符串的示例

1
请注意,这会导致标签中出现排版不正确的连字符,而不是减号。您可能需要将格式括在美元符号中以触发数学渲染。 - Andras Deak -- Слава Україні

0
如果您能够容忍一个较小的负号,那么这对我来说似乎很有效。
arr = np.random.randn(10,10)

fig, ax = plt.subplots()

im = ax.imshow(arr, interpolation=None)
cb =  plt.colorbar(im)

def format_func(x, pos):
    x = str(x)
    pad = '' if x.startswith('-') else ' '
    return '{}{}'.format(pad, x)

cb.ax.yaxis.major.formatter = mpl.ticker.FuncFormatter(format_func)

可以在这里找到Tick Locator和Formatter的文档。

我猜如果你切换到等宽字体,结果会更好。主要优点是不需要手动设置padx值。

我还不够酷,无法嵌入图片,所以如果你想看输出结果,这里是默认大小,以及最大化后的效果。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接