【问题标题】:Matplotlib log colorbar minor ticks disappear when range is less than a decade当范围小于十年时,Matplotlib 日志颜色条小刻度消失
【发布时间】:2014-05-14 13:50:06
【问题描述】:

我的用户有时希望看到二维绘图值的对数缩放,即使数据跨度不到 10 年。我可以使用 'pcolormesh' 或 'imshow' 使用

norm=LogNorm(vmin=minimum,vmax=maximum)

参数并准确显示对数缩放的“强度”值。我希望“颜色条”显示一些小刻度和刻度标签,但是当最小和最大跨度小于十年时,无论我做什么,都只显示一个刻度值。我尝试了此 SO 帖子中的建议:

Minor ticks in matplotlib's colorbar

改编于以下sn-p:

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(X/10 + Y/10)

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

cb.ax.minorticks_on()

plt.show()

但是没有小标记,标记或其他:

我还尝试了以下方法:

from matplotlib.ticker import LogFormatterMathtext
from matplotlib.ticker import LogLocator
from matplotlib.ticker import LogFormatter
import numpy as nmp
import matplotlib.pyplot as pyp
'''
<snip>
'''
ccbb=pyp.colorbar(label='ohms')
ccbb.ax.yaxis.set_minor_locator(LogLocator(subs=nmp.arange(2,10)))
# AND/OR
# ccbb.ax.yaxis.set_minor_locator(LogLocator(subs=[0.2,0.5,1.0]))
ccbb.ax.yaxis.set_minor_formatter(LogFormatterMathtext())
ccbb.update_ticks()
'''
<snip>
'''

还有其他一些我没有保存的东西。所有这些都产生相同的结果,颜色条除了单个十年刻度/标签之外缺少任何内容。股票代码类的文档非常难以理解:

http://matplotlib.org/api/ticker_api.html

特别是下面关于LogFormatter参数labelOnlyBase的声明: “base 用于定位十年刻度,如果 labelOnlyBase 为 False,这将是唯一要标记的刻度” False 和 True 都不会导致比基数更多的刻度,我想那是因为这指的是主要刻度,但是为什么在世界上我不能得到小勾号或标签吗??

任何建议将不胜感激。

【问题讨论】:

标签: matplotlib colorbar


【解决方案1】:

Matplotlib 颜色条似乎不会在对数刻度上做小刻度。使用this answer 中的方法可以工作,虽然它有点不方便 - 有一天这将是自动的,但现在你必须手动组织次要刻度值(在这种情况下为np.arange(2, 10)/10.,但你必须附加np.arange(2, 10) 如果你的值上升到 10)

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(X + Y)
Z = np.abs(X/10 + Y/10)

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

# cb.ax.minorticks_on()

# We need to nomalize the tick locations so that they're in the range from 0-1...
minorticks = p.norm(np.arange(2, 10)/10.)
cb.ax.yaxis.set_ticks(minorticks, minor=True)

plt.show()

minorticks_on() 方法没有做任何事情,所以我把它注释掉了。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-02-04
    • 1970-01-01
    • 1970-01-01
    • 2017-03-11
    • 2013-09-13
    • 2017-10-20
    相关资源
    最近更新 更多