Matplotlib颜色条的位置和大小

15
我正在使用quadmesh创建一个简单的极坐标投影图。以下是一个最小的脚本,基本上可以实现我想要做的事情:

我正在使用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')

以上脚本创建了一个看起来像这样的图:

enter image description here

我希望颜色条:

  1. 不要重叠在6标签上。
  2. 被缩放为与绘图大致相同的高度。

有什么技巧可以使这个工作正常吗?(请注意,这种布局不是我将要使用的唯一布局 - 例如,我可能会使用1x2布局或4x4布局...似乎应该有某种方法将颜色条缩放为与相关绘图相同的高度...)

2个回答

29

这种组合(或接近这些值)似乎在我保持色条与绘图比例尺的一致性方面“神奇”地有效,无论显示器尺寸如何。

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

2
这对我来说完美地运作了。使用最新版本的matplotlib(截至撰写本文时)。谢谢! - user3125347
2
这对于一张比高度宽得多的图片不起作用。 - Lasse Meyer

16

您可以通过结合padshrinkaspect参数来实现:

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文档

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

轴的大小似乎没有缩小到极坐标图,因此在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
@mgilson 我记错了密钥,请看编辑。我认为根本问题在于 axes 对象的边界框没有紧贴极坐标图,所有颜色条长度都是基于过大的边界框键入的。 - tacaswell
我仍然得到一个KeyError,它是关于savefig.bbox的。我甚至尝试过[v for v in matplotlib.rcParams.values() if isinstance(v,str) and 'tight' in v]这个方法,但得到了一个空列表。我使用的是1.1.1版本。 - mgilson
@mgilson 经过进一步的思考,我认为那个绑定框的想法是一个死胡同,抱歉。 - tacaswell

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接