【问题标题】:Matplotlib colorbar: some ticks appear without labelsMatplotlib colorbar:一些刻度出现没有标签
【发布时间】:2021-02-19 14:32:26
【问题描述】:

我正在使用 plr.scatter 和对数刻度,我正在尝试向颜色条添加一些特定的刻度值,但它似乎真的很随意。看例子:

import numpy as np
import matplotlib.pyplot as plt
from matplotlib import cm
import matplotlib
from matplotlib.ticker import LogFormatter

x, y = np.meshgrid(np.linspace(0, 1, 30), np.linspace(0, 1, 30))
z = x**2 + 15*y**3 + 1.5
plt.figure(figsize=(9, 4.5))
plt.scatter(x, y, c=z, cmap=cm.jet, norm=matplotlib.colors.LogNorm(), vmin=1, vmax=20)
formatter = LogFormatter(10, labelOnlyBase=False) 
cbar = plt.colorbar(ticks=[1, 2, 5, 10, 15, 20], format=formatter)

此代码生成了所有必需的主要刻度以及一些次要刻度,但仅标记为 1 和 10,而我需要在颜色栏中看到所有数字。一开始我以为是因为1和10是10的整数次方,而其他数字不是,但是……

...如果我将日志基数更改为 2,我们可以在 1 和 2 处看到刻度标签,它们是 2 的幂,但我们也在 5、10 和 20 处看到标签,但不是。这次也没有出现 15,但是如果我尝试添加 17,它会起作用(图片上没有显示,但确实出现了)

formatter = LogFormatter(2, labelOnlyBase=False)

这是什么魔法,如何让 matplotlib 准确地将我想要的标签添加到刻度?我可以手动使用

cbar.ax.set_yticklabels(['1', '2', '5', '10', '15', '20'])

但这似乎是多余的。有没有更好的办法?

【问题讨论】:

    标签: python matplotlib colorbar


    【解决方案1】:

    您可以使用formatter 格式化any axis 刻度。下面是例子。

    import numpy as np
    import matplotlib.pyplot as plt
    from matplotlib import cm
    import matplotlib
    from matplotlib.colors import LogNorm
    
    x, y = np.meshgrid(np.linspace(0, 1, 30), np.linspace(0, 1, 30))
    z = x**2 + 15*y**3 + 1.5
    f, ax = plt.subplots(figsize=(9, 4.5))
    p = plt.scatter(x, y, c=z, cmap=cm.jet, norm=LogNorm(vmin=1, vmax=20) )
    
    v1 = np.linspace(z.min(), z.max(), 8, endpoint=True)
    
    cbar=plt.colorbar(ticks=v1)              
    cbar.ax.set_yticklabels(["{:4.2f}".format(i) for i in v1]) # add the labels
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-09-23
      • 2014-11-26
      • 1970-01-01
      • 2018-06-03
      • 2016-05-04
      • 2020-06-04
      • 2019-07-10
      • 1970-01-01
      相关资源
      最近更新 更多