【问题标题】:Align ticklabels in matplotlib colorbar在 matplotlib 颜色栏中对齐刻度标签
【发布时间】:2020-03-04 12:49:03
【问题描述】:

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

【问题讨论】:

  • 我不知道到目前为止我是如何错过这个问题的,我已经多次彻底搜索过类似的东西。看似我们想做的一件简单而自然的事情……这需要更多的支持;)

标签: python matplotlib


【解决方案1】:

您可以更改文本的对齐方式。可能需要稍微更改标签的 (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)

【讨论】:

  • 只是想让您知道,我发现了一个稍微不同的解决方案,它对更改窗口大小更加稳健。我留下这条评论的主要目的是请你让我知道你是否在过去 2 年中找到了一些更好的解决方法。
【解决方案2】:

我正要问同样的问题,然后终于找到了你的问题。所以我想添加我自己的解决方法。

起初我使用完全相同的解决方案given by 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 个输出来说明我的意思:顶行是位置偏移解决方案,底行是我的填充解决方案。左边是默认的数字窗口大小,右边是savefigged 将数字窗口弹出到全屏后:

【讨论】:

    【解决方案3】:

    在创建颜色条时使用格式选项最容易做到这一点。

    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)
    

    刻度的数量和分布可能会根据您使用的格式而变化。

    【讨论】:

    • 请注意,这会导致连字符排版错误,而不是标签中的减号。您可能必须将格式括在美元符号中才能触发数学渲染。
    【解决方案4】:

    如果您愿意容忍较小的负号,那么这对我来说似乎很有效。

    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 的文档可以在 here 找到

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

    我还不够酷,无法嵌入图像,所以如果您有兴趣查看 此处输出为default 大小,在maximizing 之后。

    【讨论】:

      猜你喜欢
      • 2017-01-22
      • 1970-01-01
      • 1970-01-01
      • 2016-06-14
      • 2020-02-18
      • 2021-03-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多