我有一个带有正负值的颜色条,它们是自动生成的(我没有设置它们)。不幸的是,减号破坏了文本的垂直对齐方式。如何将刻度标签中的所有文本向右对齐,或者在我的正数之前插入一个空格以使其看起来不错?
4 回答
您可以更改文本的对齐方式。可能需要稍微更改标签的 (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)
我正要问同样的问题,然后终于找到了你的问题。所以我想添加我自己的解决方法。
起初,我使用了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 个输出来说明我的意思:顶行是位置移动解决方案,底行是我的填充解决方案。左侧是默认图形窗口大小,右侧是savefig
在将图形窗口弹出到全屏后生成的:
创建颜色条时,使用格式选项最容易做到这一点。
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)
刻度的数量和分布可能会根据您使用的格式而改变。
如果您愿意容忍较小的负号,那么这对我来说似乎很有效。
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 的文档可以在这里找到
我的猜测是,如果您切换到等宽字体,结果会更好。主要优点是没有手动设置pad
或x
值。