2010-09-09 45 views
4

以下生成一個包含三個數據點(0,0),(0,0.5)和(1,1)的圖。只有位於繪圖區域內的繪製點(小圓圈)部分是可見的,所以我在角落看到四分之一圓,沿着左脊看到一個半圓。如何繪製點,使它們出現在matplotlib的頂端?

是否有一個技巧,我可以使所有的點完全可見,所以他們不被剪裁在軸框架內?

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') 

編輯:荷銀的建議 - 的顯而易見的方法 - 是不優選的方法,因爲這些是ROC曲線圖(與框常規繪製從0到1在兩個軸上)。如果我可以讓matplotlib產生與http://www.google.com/search?q=roc+plot類似的結果,在兩個軸上都有一個緊密圍繞0..1的框,但在軸線的頂部繪製了多個點,這將是最優的。

編輯2:我猜這是可以做到用「spine placement」(新的一樣的MPL 0.99),隨着劇情面積稍微放大爲荷銀建議,但隨後略有重新定位是沿着兩個刺0軸。我會試驗這個,併發佈一個答案,如果它的工作,但隨時打敗我。

回答

7

您可以在繪圖命令中或通過調用「繪圖」返回的藝術家對象中關閉裁剪。

首先,這裏的數字,但有額外大的符號所以很清楚:

alt text

在繪圖命令,你可以做

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) 
+0

我還需要添加zorder = 3,所以點在Spines(如果存在的話)上出現,而不是從下面偷看,但這是我需要的「技巧」。謝謝! :) – 2010-09-10 10:51:23

2

可以擴展軸限制其在所有方向上的位:

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

alt text

+0

感謝您的建議,但不幸的是,我相信這將是不合時宜的最終涉及的情節類型。請參閱http://www.google.com/images?q=roc+plot – 2010-09-09 22:46:19

+1

上的許多示例或使用「邊距(0.1,0.1)」? – endolith 2013-03-14 21:21:58

1

我使用與荷銀的建議新spine.set_position()功能略有擴大範圍結合了我的想法。以下僅適用於matplotlib 1.0或更高版本,因爲它依賴於新的spine.set_bounds()調用。 (我相信荷銀的想法需要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對這個區域有一個基本的限制:所有的數據都被定義在該軸上的區域嚴格限制。