【问题标题】:Colorbar offsetText (scientific base multiplier) move from top to bottom of colorbarColorbar offsetText(科学基数乘数)从颜色条的顶部移动到底部
【发布时间】:2017-05-01 11:19:43
【问题描述】:

这个“简单”的问题让我失去了理智:

在 matplotlib 的颜色条(如图所示)中,我需要将 offsetText(基本乘数)从颜色条的顶部移动到底部。

我用于这个情节的代码是(使用 gridspec):

f.add_subplot(ax12)

ax10 = plt.Subplot(f, gs00[1, 0])
cb = plt.colorbar(h3,cax=ax10)
cb.formatter.set_scientific(True)
cb.formatter.set_powerlimits((0,0))
cb.ax.yaxis.offsetText.set(size=6)
cb.update_ticks()

ax10.yaxis.set_ticks_position('left')
ax10.tick_params(labelsize=6)
f.add_subplot(ax10)

提前致谢! (顺便说一句,Python 版本 = 2.7.6,matplotlib 版本 = 1.3.1 - 在我完成当前项目之前升级目前不是一个选项)

【问题讨论】:

  • “1e5”来自您的代码的哪一部分?
  • 我正在做散点图,我正在使用另一个数组,其值显示为颜色图。该数组实际上具有从 1e3 到 1e6 的值(通常)。代码:h3 = ax12.scatter(x[j], y[j], c=temp[j], marker='.', s=10.0, cmap='hot', edgecolors='none') 那h3就是传递给 plt.colorbar 并且值在 temp[] 数组中。

标签: python numpy matplotlib colorbar


【解决方案1】:

通常无法更改 offsetText 标签的位置。这仍然是open issue

因此,一个解决方案可以是覆盖 yaxis 的 _update_offset_text_position 方法以将 offsetText 定位在 yaxis 的底部。

import matplotlib.pyplot as plt
import types

def bottom_offset(self, bboxes, bboxes2):
    bottom = self.axes.bbox.ymin
    self.offsetText.set(va="top", ha="left")
    self.offsetText.set_position(
            (0, bottom - self.OFFSETTEXTPAD * self.figure.dpi / 72.0))

fig, ax = plt.subplots()
im = ax.imshow([[1e5,2e5],[0.1e5,1e5]])
cb = plt.colorbar(im)
cb.formatter.set_scientific(True)
cb.formatter.set_powerlimits((0,0))

def register_bottom_offset(axis, func):
    axis._update_offset_text_position = types.MethodType(func, axis)
register_bottom_offset(cb.ax.yaxis, bottom_offset)

cb.update_ticks()

plt.show()

如果颜色条位于绘图的左侧,则以下内容可能看起来更好:

self.offsetText.set(va="top", ha="right")
self.offsetText.set_position(
            (1, bottom - self.OFFSETTEXTPAD * self.figure.dpi / 72.0))

【讨论】:

  • 我不确定这是否比手动放置文本标签更优雅。
  • 不知道优雅,但你的回答肯定更有洞察力,并触及本质。现在我知道那里发生了什么。接受了你的回答。谢谢!
【解决方案2】:

嗯...显然,无法向上或向下移动颜色条的科学基础乘数,只能稍微向左或向右移动。

解决方法是隐藏它并添加(相同)将位于底部的自定义文本(在我的情况下):

    cb.ax.yaxis.get_offset_text().set_visible(False)
    cb.ax.text(0.5, -0.1, '1e4', va='bottom', ha='center', size=6)

如果有人有更优雅的解决方案,我会很高兴看到它!

【讨论】:

    猜你喜欢
    • 2021-06-26
    • 2019-08-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-12-01
    • 2012-06-01
    相关资源
    最近更新 更多