我如何绘制点,以便它们出现在matplotlib的脊柱顶部?

时间:2010-09-09 21:55:31

标签: matplotlib

以下生成带有三个数据点的图,分别为(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 个答案:

答案 0 :(得分:7)

您可以在plot命令中或通过调用“plot”返回的artist对象中关闭剪辑。

首先,这是图,带有额外的大符号,所以很清楚:

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)

答案 1 :(得分:2)

您可以在所有方向上扩展轴限制:

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

alt text

答案 2 :(得分:1)

我结合了我的想法,使用新的spine.set_position()功能和Amro的建议来稍微扩展边界。以下仅适用于matplotlib 1.0或更高版本,因为它依赖于新的spine.set_bounds()调用。 (我相信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在这个区域有一个基本限制:所有数据都被为轴定义的区域严格限制。