当范围小于十年时,Matplotlib日志颜色条小标记消失

时间:2014-04-03 00:36:47

标签: matplotlib colorbar

我的用户有时希望看到二维图的值的对数缩放,即使数据跨越不到十年。我可以使用

使用'pcolormesh'或'imshow'制作情节
norm=LogNorm(vmin=minimum,vmax=maximum)

参数并准确显示日志缩放的“强度”值。我希望'colorbar'显示一些小的刻度和刻度标签,但是当最小和最大跨度不到十年时,无论我做什么,只显示一个刻度值。我在这篇SO帖子中尝试了这个建议:

Minor ticks in matplotlib's colorbar

在以下代码段中进行了改编:

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()

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

Colorbar is Missing Minor Ticks

我也尝试了以下内容:

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都不会导致超过基数被勾选,我想这是因为这指的是主要刻度,但为什么在世界上我不能得到次要的滴答声或标签??

任何建议都将受到赞赏。

1 个答案:

答案 0 :(得分:0)

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

enter image description here

minorticks_on()方法没有做任何事情,所以我对它进行了评论。