【问题标题】:matplotlib colorbar placement and sizematplotlib 颜色条的位置和大小
【发布时间】:2013-05-18 03:17:31
【问题描述】:

我正在使用quadmesh 创建一个简单的极坐标投影图。这是一个最小的脚本,它基本上产生了我想要做的事情:

from __future__ import unicode_literals
import numpy as np
import matplotlib.pyplot as plt

def make_plot(data,fig,subplot):
    nphi,nt = data.shape
    phi_coords = np.linspace(0,np.pi*2,nphi+1) - np.pi/2.
    theta_coords = np.linspace(0,np.radians(35),nt+1)

    ax = fig.add_subplot(subplot,projection='polar')
    ax.set_thetagrids((45,90,135,180,225,270,315,360),(9,12,15,18,21,24,3,6))
    ax.set_rgrids(np.arange(10,35,10),fmt='%s\u00b0')  

    theta,phi = np.meshgrid(phi_coords,theta_coords)
    quadmesh = ax.pcolormesh(theta,phi,data)
    ax.grid(True)
    fig.colorbar(quadmesh,ax=ax)
    return fig,ax


a = np.zeros((360,71)) + np.arange(360)[:,None]
b = np.random.random((360,71))
fig = plt.figure()
t1 = make_plot(a,fig,121)
t2 = make_plot(b,fig,122)
fig.savefig('test.png')

上面的脚本创建了一个如下所示的图:

我希望颜色条:

  1. 不与 6 标签重叠。
  2. 进行缩放,使它们与绘图的高度大致相同。

有什么诀窍可以让它正常工作吗? (请注意,这种布局不是我将使用的唯一布局——例如,我可能使用 1x2 布局或 4x4 布局......似乎应该有某种方法将颜色条缩放到与相关情节...)

【问题讨论】:

    标签: python layout matplotlib


    【解决方案1】:

    您可以结合使用padshrinkaspect kwargs:

    from __future__ import unicode_literals
    import numpy as np
    import matplotlib.pyplot as plt
    
    def make_plot(data,fig,subplot):
        nphi,nt = data.shape
        phi_coords = np.linspace(0,np.pi*2,nphi+1) - np.pi/2.
        theta_coords = np.linspace(0,np.radians(35),nt+1)
    
        ax = fig.add_subplot(subplot,projection='polar')
        ax.set_thetagrids((45,90,135,180,225,270,315,360),(9,12,15,18,21,24,3,6))
        ax.set_rgrids(np.arange(10,35,10),fmt='%s\u00b0')  
    
        theta,phi = np.meshgrid(phi_coords,theta_coords)
        quadmesh = ax.pcolormesh(theta,phi,data)
        ax.grid(True)
        cb = fig.colorbar(quadmesh,ax=ax, shrink=.5, pad=.2, aspect=10)
        return fig,ax,cb
    
    
    a = np.zeros((360,71)) + np.arange(360)[:,None]
    b = np.random.random((360,71))
    fig = plt.figure()
    t1 = make_plot(a,fig,121)
    t2 = make_plot(b,fig,122)
    

    figure.colorbar doc

    这些参数的最佳值取决于轴的纵横比。

    坐标轴的大小似乎没有收缩到极坐标图上,因此在 1x2 排列中,坐标轴对象中的图上方和下方有很多空间,但是是空的。颜色条的大小与矩形大小无关,而不是圆形大小,因此默认值无法正常工作。可能有一种方法可以进行收缩包装,但我不知道该怎么做。

    另一种方法是强制您的图形具有正确的纵横比,例如:

    fig.set_size_inches(10, 4) # for 1x2
    fig.set_size_inches(4, 10) # for 2x1
    

    这使子图呈正方形,因此默认值或多或少起作用。

    【讨论】:

    • 这适用于 2x1 布局(或多或少),但不适用于 1x2 布局(然后颜色栏变得太小)。我真的在寻找一个独立于布局的解决方案。就我的 rcparams 而言,我不确定。我没有任何 rc 文件(据我所知),print matplotlib.rcParams['bounding_box_tight'] 导致KeyError
    • @mgilson 我记错了密钥,请参阅编辑。我认为根本问题是axes 对象的边界框不会在极坐标图周围收缩,并且所有颜色条长度都与过大的边界框无关。
    • 我仍然为savefig.bbox 获得KeyError。我什至尝试了[v for v in matplotlib.rcParams.values() if isinstance(v,str) and 'tight' in v],它给了我一个空列表。我使用的是 1.1.1 版。
    • @mgilson 进一步思考,我认为绑定盒是一条死胡同,抱歉。
    【解决方案2】:

    这种组合(以及接近这些的值)似乎“神奇地”让我保持颜色条按比例缩放到绘图,无论显示器大小。

    plt.colorbar(im,fraction=0.046, pad=0.04)
    

    【讨论】:

    • 这对我来说非常有效。使用最新版本的 matplotlib(截至撰写本文时)。谢谢!
    • 这不适用于比高宽得多的图像。
    猜你喜欢
    • 2013-08-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-05-14
    • 2023-03-03
    • 1970-01-01
    • 2017-03-04
    相关资源
    最近更新 更多