【问题标题】:Get real range in colormap with LogLocator使用 LogLocator 获取颜色图中的真实范围
【发布时间】:2018-12-07 13:40:14
【问题描述】:

以下代码

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

n = 50
A = np.tile(np.linspace(-26,-2,n),(n,1))
plt.figure()
plt.contourf(A)
plt.colorbar()

B = np.tile(np.logspace(-26,-2,n),(n,1))
plt.figure()
plt.contourf(B,locator=ticker.LogLocator())
plt.colorbar()

plt.show()

产生这两个图:

对于线性情况(第一个图像),颜色栏中的每种颜色都存在于图像中,A 的最小值和最大值分别位于第一个和最后一个颜色箱中(从下到上)。

对于日志案例(第二张图片),颜色条的最小值和最大值对我来说不再有意义。 B 的最小值为 10^-26,因此该值位于颜色图的第一个和第二个颜色箱之间的边界,但图像中没有这两种第一种颜色。 B 的最大值是 10^-2,它位于 before-before last 和 before last 颜色 bin 之间的边界,因此可以在其中一个中考虑。 但是,为什么这里是最后一个(黄色)颜色箱,特别是因为图像中没有黄色?

所以我发现颜色图限制的默认行为(对于 LogLocator)很奇怪,因为它不代表真实(或至少是近似的)数据范围(如在线性情况下),并且它添加了颜色箱(在这种情况下 3 : 低于最小值 2,高于最大值 1),图像中不存在。

这是一个错误还是我不明白的地方?

@ImportanceOfBeingErnest 在下面的回答给出了我想要的输出,但我感觉我不应该这样做,而且我可以从具有线性值的颜色映射和 LogLocator 颜色映射器中获得相同的行为。

【问题讨论】:

    标签: matplotlib colorbar


    【解决方案1】:

    如果您想在等高线图中有特定的间隔,您需要决定它们并通过levels 参数将它们提供给等高线函数。

    import matplotlib.pyplot as plt
    import numpy as np
    from matplotlib import ticker
    
    n = 50
    A = np.tile(np.logspace(-26,-2,n),(n,1))
    levels = 10.**np.arange(-26,-1,4)
    plt.figure()
    plt.contourf(A,levels=levels, locator=ticker.LogLocator())
    plt.colorbar()
    plt.show()
    

    【讨论】:

    • 我对想要的结果有点迷茫。如果自动刻度不是您想要的,您需要使用自定义刻度。
    • 我重新编辑了我的问题(很多),我希望它会更清楚:)
    • 所以目标是编写一个自定义Locator 来选择线性AutoLocator 将为数据选择10 的bin?
    • 编写一个自定义的Locator 来选择线性AutoLocator 将为log10 数据选择的bin 更多。我希望 LogLocator 的默认行为基本上绘制plt.contourf(np.log10(B)),但刻度的标签是 10^x 而不是 x。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-01-21
    • 1970-01-01
    • 1970-01-01
    • 2016-07-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多