matplotlib在使用子图时很小

时间:2018-05-07 16:26:57

标签: matplotlib jupyter-notebook

我试图让自定义宽高比的地块正确显示。我正在使用Jupyter笔记本进行渲染,但我通常这样做的方法是调整' figsize'子图中的属性。我已经完成了如下操作:

from matplotlib import pyplot as plt
fig,axes = plt.subplots(1,1,figsize=(16.0,8.0),frameon=False)

问题在于,虽然宽高比看起来是正确的(通过眼睛判断),但是这个数字甚至没有用尽甚至接近整个页面宽度,因此很小并且难以阅读。

我猜它的行为就像在左右两侧设置了某种边距,但我无法找到控制它的全局设置。我一直在使用设置列表here,但没有成功找到相关的设置。

我的问题是

  1. 如何调整宽高比而不影响图形的整体尺寸(想想轴标签的字体大小)?我不需要将屏幕的宽度作为约束,我非常高兴Jupyter笔记本能给我一个水平滚动条。
  2. 是否有可以获得所有matplotlib参数的更全面,编写良好的文档的地方?我上面链接的那个很尴尬,因为它以示例matplotlibrc文件的形式提供参数。我想知道是否存在包含所有参数(良好)描述的单个页面。
  3. 编辑:有人指出,这可能是一个jupyter问题,我正在设置宽高比。我使用的是Jupyter 1.0.0版。下面是简化笔记本输出的图片。

    picture of figure from ipy notebook

    很容易看出,即使靠近可用的水平空间,该图也不会使用。

    笔记本中的代码是:

    #imports
    import numpy as np
    
    #set up a plot 
    import matplotlib as mpl
    from matplotlib import pyplot as plt
    #got smarter about the mpl config: see mplstyles/ directory
    plt.style.use('standard')
    
    #set up a 2-d plot
    
    fig,axes = plt.subplots(1,1,figsize=(16.0,8.0),frameon=False)
    ax1 = axes
    
    #need to play with axis
    mpl.rcParams['ytick.minor.visible'] = False
    
    xmin = -10
    xmax = 10
    ymin = -10 
    ymax = 10
    x = np.random.normal(0,5,(20000,))
    y = np.random.normal(0,5,(20000,))
    h = ax1.hist2d(x,y, bins=200, cmap='inferno')
    ax1.set_xlim(xmin,xmax)
    ax1.set_ylim(ymin,ymax)
    ax1.set_xlabel('epoch time [Unix]',**axis_font) 
    ax1.set_ylabel(r'relative time [$\mu$s]',**axis_font)
    ax1.grid(True)
    
    
    #lgnd= ax1.legend(loc=2,prop={'size':22})
    
    for axis in ['top','bottom','left','right']:
      ax1.spines[axis].set_linewidth(2)
    
    plt.tight_layout()
    #plt.savefig('figures/thefigure.eps')
    plt.show()
    

    我在plt.style.use命令中使用的mpl样式文件是:

    #trying to customize here, see:
    #https://matplotlib.org/users/customizing.html
    #matplotlib.rc('figure', figsize=(3.4, 3.4*(4/6)))
    lines.linewidth : 2
    
    #ticks
    xtick.top : False
    xtick.bottom : True
    xtick.minor.visible : True
    xtick.direction : in
    xtick.major.size : 8
    xtick.minor.size : 4
    xtick.major.width : 2
    xtick.minor.width : 1
    xtick.labelsize : 22
    
    ytick.left : True
    ytick.right : False
    ytick.minor.visible : True
    ytick.direction : in
    ytick.major.size : 8
    ytick.minor.size : 4
    ytick.major.width : 2
    ytick.minor.width : 1
    ytick.labelsize : 22
    
    
    #error bars
    #errorbar.capsize : 3
    
    #axis stuff
    axes.labelsize : 22
    

    编辑2:在绘制结果所需的输出之前,将矢量范围限制在轴的范围内。见下图:

    modified jupyter notebook

    添加/修改的行是:

    xnew = x[(np.abs(x)<10) & (np.abs(y)<10)]
    ynew = y[(np.abs(x)<10) & (np.abs(y)<10)]
    h = ax1.hist2d(xnew,ynew, bins=200, cmap='inferno')
    

2 个答案:

答案 0 :(得分:1)

显然matplotlib 2.2.2中有一个错误,现在已经在开发版本中修复了。您当然可以从github安装当前的开发版本。

问题来自设置轴限制(ax1.set_xlim(-10,10)),它们小于初始图像。出于某种原因,原始限制仍然用于计算紧密的bbox以保存为png。

解决方法不是手动设置任何轴限制,而是直接计算直方图,并考虑所需的限制。在这种情况下-10,10,例如:

x = np.random.normal(0,5,(20000,))
y = np.random.normal(0,5,(20000,))
bins = np.linspace(-10,10,201)
h = ax1.hist2d(x,y, bins=bins, cmap='inferno')

答案 1 :(得分:0)

要更改轴标签的字体大小,您必须使用plt.rcplt.rcParams(此here上的更多内容),因此您无需担心这样做当使用figsize时。

我发现您发布的代码没有任何问题,您是否可以发布您所获得的内容以及您希望获得的内容?这就是我在Jupyter笔记本上使用的配置,只是绘制一个非常简单的图: Plot on Jupyter notebook

请注意,但是,Jupyter会自动限制绘图的大小(见下文):Plot with max width Plot with no max width

我担心第二个问题无法帮助你,因为我总是发现matplotlib的文档足以满足我的所有需求......祝你好运!