代码之家  ›  专栏  ›  技术社区  ›  Peter Hansen

如何绘制点,使它们出现在具有matplotlib的脊椎顶部?

  •  4
  • Peter Hansen  · 技术社区  · 14 年前

    下面生成一个包含三个数据点的图,分别是(0,0),(0,0.5)和(1,1)。只有绘图区域内的部分绘图点(小圆)是可见的,所以我看到角上有四分之一圆,左脊柱上有半个圆。

    有没有一个技巧,我可以用来使所有的点完全可见,所以他们没有剪辑在轴框架内?

    from matplotlib.backends.backend_agg import FigureCanvasAgg as FigureCanvas
    from matplotlib.figure import Figure
    
    fig = Figure()
    canvas = FigureCanvas(fig)
    ax = fig.add_subplot(111)
    ax.plot([0, 0, 1], [0, 0.5, 1], 'o')
    fig.canvas.print_figure('test.png')
    

    编辑: Amro的建议——显而易见的方法——并不是首选的方法,因为这些方法适用于ROC图(通常在两个轴上用从0到1的框绘制)。如果我能欺骗Matplotlib产生类似于 http://www.google.com/search?q=roc+plot 它在两个轴上都有一个紧围绕0..1的框,但在轴线的顶部绘制了许多点,这是最佳的。

    编辑2: 我想这可以用 spine placement “(新的MPL 0.99),绘图面积略有扩大,如AMRO建议的,但随后,尖晶石重新定位为沿两个0轴。我会用这个做实验,如果它有效的话,我会贴出一个答案,尽管你可以打败我。

    3 回复  |  直到 14 年前
        1
  •  7
  •   tom10    14 年前

    您可以在plot命令或调用“plot”返回的艺术家对象中关闭剪辑。

    首先,这是一个数字,带有超大的符号,所以很明显:

    在plot命令中可以执行

    ax.plot([0,0,1],[0,0.5,1],'o',clip_on=false,markersize=20)
    < /代码> 
    
    

    或者你可以

    p=ax.plot([0,0,1],[0,0.5,1],'o',markersize=20)
    M在P:
    M.设置“剪辑”(假)
    < /代码> 
    或者在调用“plot”返回的艺术家对象中。

    首先,这是一个数字,有一些特别大的符号,所以很明显:

    alt text

    在plot命令中可以执行

    ax.plot([0, 0, 1], [0, 0.5, 1], 'o', clip_on=False, markersize=20)
    

    或者你可以

    p = ax.plot([0, 0, 1], [0, 0.5, 1], 'o', markersize=20)
    for m in p:
        m.set_clip_on(False)
    
        2
  •  2
  •   Amro    14 年前

    您可以将轴限制向所有方向延伸一点:

    ax=fig.add_subflot(111,xlim=(-0.1,1.1),ylim=(-0.1,1.1))。
    < /代码> 
    
    

    ax = fig.add_subplot(111, xlim=(-0.1,1.1), ylim=(-0.1,1.1))
    

    alt text

        3
  •  1
  •   Peter Hansen    14 年前

    我结合了我的想法,使用了新的spine.set position()功能和amro的建议来稍微扩展边界。以下仅适用于Matplotlib 1.0或更高版本,因为它依赖于新的spine.set ound()调用。(我认为Amro的想法也需要1.0或更高版本,因为xlim/ylim-kwargs对0.99.1没有任何帮助。)

    fig = Figure()
    canvas = FigureCanvas(fig)
    ax = fig.add_subplot(111, xlim=(-0.1, 1.1), ylim=(-0.1, 1.1))
    ax.plot([0, 0, 1], [0, 0.5, 1], 'o')
    for side in 'left bottom top right'.split():
        ax.spines[side].set_position('zero')
        ax.spines[side].set_bounds(0, 1)
    canvas.print_figure('test.png')
    

    如果有不同的方法,我还是很感兴趣的,但是我猜在谷歌搜索了很多之后,matplotlib在这个区域有一个基本的限制:所有的数据都被定义为轴的区域紧紧地限制住了。