【问题标题】:Minor ticks in matplotlib's colorbarmatplotlib 颜色栏中的小刻度
【发布时间】:2013-11-19 18:31:07
【问题描述】:

我目前正在尝试在颜色栏中设置次要刻度,但根本无法使其工作。我尝试了 3 种方法(请参见下面的代码),但它们似乎都不起作用。彩条中真的可以有小刻度吗?

import numpy as np
import matplotlib.pyplot as plt
from matplotlib.colors import LogNorm
from matplotlib.ticker import FixedLocator, FormatStrFormatter

# fill grid
x = np.linspace(1,10,10)
y = np.linspace(1,10,10)

X, Y = np.meshgrid(x,y)
Z = np.abs(np.cos(X**2 - Y**2) * X**2 * Y)

# plot
f, ax = subplots(1)
p = plt.pcolormesh(X, Y, Z, norm=LogNorm(), vmin=1e-2, vmax=1e2)
cb = plt.colorbar(p, ax=ax, orientation='horizontal', aspect=10)

minor_ticks = np.arange(1,10,2)
#cb.set_ticks(minor_ticks, minor=True) # error: doesn't support keyword argument 'minor'
#cb.ax.xaxis.set_ticks(minor_ticks, minor=True) # plots an extremely small colorbar, with wrong ticks
#cb.ax.xaxis.set_minor_locator(FixedLocator(minor_ticks)) # nothing happens
plt.show()

【问题讨论】:

    标签: python matplotlib


    【解决方案1】:

    你在正确的轨道上,你只需要cb.ax.minorticks_on()

    例如:

    import numpy as np
    import matplotlib.pyplot as plt
    from matplotlib.colors import LogNorm
    
    # fill grid
    x = np.linspace(1,10,10)
    y = np.linspace(1,10,10)
    
    X, Y = np.meshgrid(x,y)
    Z = np.abs(np.cos(X**2 - Y**2) * X**2 * Y)
    
    # plot
    f, ax = plt.subplots()
    p = plt.pcolormesh(X, Y, Z, norm=LogNorm(), vmin=1e-2, vmax=1e2)
    cb = plt.colorbar(p, ax=ax, orientation='horizontal', aspect=10)
    
    cb.ax.minorticks_on()
    
    plt.show()
    


    如果您只需要指定的刻度,您仍以“正常”方式设置它们,但请注意,无论您的数据范围如何,颜色条轴坐标系的范围都是 0-1。

    因此,要设置您想要的特定值,我们需要使用图像使用的同一 norm 实例调用标准化刻度位置。

    例如:

    import numpy as np
    import matplotlib.pyplot as plt
    from matplotlib.colors import LogNorm
    
    # fill grid
    x = np.linspace(1,10,10)
    y = np.linspace(1,10,10)
    
    X, Y = np.meshgrid(x,y)
    Z = np.abs(np.cos(X**2 - Y**2) * X**2 * Y)
    
    # plot
    f, ax = plt.subplots()
    p = plt.pcolormesh(X, Y, Z, norm=LogNorm(), vmin=1e-2, vmax=1e2)
    cb = plt.colorbar(p, ax=ax, orientation='horizontal', aspect=10)
    
    # We need to nomalize the tick locations so that they're in the range from 0-1...
    minorticks = p.norm(np.arange(1, 10, 2))
    cb.ax.xaxis.set_ticks(minorticks, minor=True)
    
    plt.show()  
    

    【讨论】:

    • 谢谢你;无论出于何种原因,set_minor_locatorset_minor_formatter 在轴对象上被调用时似乎都被忽略了;只有ticks = <locator>.tick_values(*mappable.get_clim())axis.set_ticks(mappable.norm(ticks), minor=True) 每次都会正确设置次要定位器。很奇怪。希望颜色条 API 在未来的版本中得到清理,因为现在它看起来很乱——我也有使用 set_major_locatorset_major_formatter 而不是通过 locator=<locator>format=<formatter> kwargs 的问题。
    猜你喜欢
    • 1970-01-01
    • 2016-06-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-20
    • 2012-03-28
    • 2021-03-15
    • 2013-09-13
    相关资源
    最近更新 更多