【问题标题】:Forcing colorbar ticks at min/max values强制颜色条在最小值/最大值处刻度
【发布时间】:2021-03-11 15:24:58
【问题描述】:

我正在使用来自matplotlibcontourf 函数进行绘图,并想添加一个颜色条,我注意到有时刻度不会达到最大值/最小值。

有没有一种干净的方法可以强制它在这些值上设置刻度?

注意:检查zmaxmin 表明颜色条表示的值从大约-1 到1,因此我希望这不会被反映出来,这样人们就可以除了中间的一些刻度外,查看 colobar 的范围。

演示我在说什么的情节和代码

import matplotlib.pyplot as plt
import numpy as np

# Data to plot.
x, y = np.meshgrid(np.arange(7), np.arange(10))
z = np.sin(0.5 * x) * np.cos(0.52 * y)

fig, ax = plt.subplots()
cs = ax.contourf(x, y, z, levels=25)
ax.grid(c="k", ls="-", alpha=0.3)
fig.colorbar(cs, ax=ax)

fig.savefig("example.png", bbox_inches="tight")

【问题讨论】:

    标签: python-3.x matplotlib colorbar contourf


    【解决方案1】:

    最简洁的方法似乎是为contourf 提供明确的级别。如果没有给出明确的级别,contourf 似乎会根据数据中的最小值和最大值自行选择,并且还会尝试找到“好看”的数字。之后,刻度被设置为这些数字的子集,这样刻度总是与实际水平一致。 (如果您使用colorbar(..., ticks=...),这些刻度不一定与级别一致。)

    由于在给定示例中正弦和余弦未达到-11 的精确值,因此它们不在范围内。

    以下代码显示了刻度如何依赖于所选级别。 np.linspace(-1, 1, 24) 的级别不是很好的整数,但 matplotlib 仍然选择一个子集来显示。

    import matplotlib.pyplot as plt
    import numpy as np
    
    x, y = np.meshgrid(np.arange(7), np.arange(10))
    z = np.sin(0.5 * x) * np.cos(0.52 * y)
    
    fig, (ax1, ax2) = plt.subplots(ncols=2, figsize=(12, 3))
    for ax in (ax1, ax2):
        numcontours = 25 if ax == ax1 else 24
        cs = ax.contourf(x, y, z, levels=np.linspace(-1, 1, numcontours))
        ax.grid(c="k", ls="-", alpha=0.3)
        fig.colorbar(cs, ax=ax)
        ax.set_title(f'{numcontours} levels from -1 to 1')
    plt.show()
    

    【讨论】:

    • 当我说 -1 和 1 时,最大值实际上是 0.997.... 所以我只是将它四舍五入到 1。
    • 我的评论是关于试图理解 matplotlib 在幕后所做的事情。这并不是对您的评论的评论......
    • 啊,好吧,我误解了,所以颜色条没有扩展到最小/最大值的原因是因为它们不是“好”?
    • 似乎很难决定什么是“好”,最好的方法是找到足够接近的“好”值。
    猜你喜欢
    • 2016-08-03
    • 1970-01-01
    • 2018-03-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多