我的用户有时希望看到二维图的值的对数缩放,即使数据跨越不到十年。我可以使用
使用'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()
但是没有标记或其他标记的小标记:
我也尝试了以下内容:
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都不会导致超过基数被勾选,我想这是因为这指的是主要刻度,但为什么在世界上我不能得到次要的滴答声或标签??
任何建议都将受到赞赏。
答案 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()
minorticks_on()
方法没有做任何事情,所以我对它进行了评论。