2012-10-12 12 views
77

私は、python/matplotlibとipythonノートブックを使って両方使うのではなく、新しいものです。私はいくつかの注釈行を既存のグラフに追加しようとしており、グラフ上に線を描く方法を理解できません。ですから、例えば、私は次のようにプロットした場合:ipythonノートブックのmatplotlibプロットに任意の行を追加する

import numpy as np 
np.random.seed(5) 
x = arange(1, 101) 
y = 20 + 3 * x + np.random.normal(0, 60, 100) 
p = plot(x, y, "o") 

私は、次のグラフを得る:

beautiful scatter plot

それでは、どのように私は(70250)まで(70100)から垂直線を追加します? (70,100)から(90,200)までの対角線はどうですか?

私はLine2D()でいくつか試してみましたが、私の中には何も混乱はありません。 Rでは、単に線分を追加するsegment()関数を使用します。 matplotlibに相当するものはありますか? vlines使用

答えて

131

あなたが直接対応するデータとのplotコマンドを供給することによって、必要な行をプロットすることができます(セグメントの境界) :

plot([x1, x2], [y1, y2], color='k', linestyle='-', linewidth=2)

(もちろん、あなたが色、線幅、線種などを選択することができます)

あなたの例から:

import numpy as np 
import matplotlib.pyplot as plt 

np.random.seed(5) 
x = np.arange(1, 101) 
y = 20 + 3 * x + np.random.normal(0, 60, 100) 
plt.plot(x, y, "o") 


# draw vertical line from (70,100) to (70, 250) 
plt.plot([70, 70], [100, 250], 'k-', lw=2) 

# draw diagonal line from (70, 90) to (90, 200) 
plt.plot([70, 90], [90, 200], 'k-') 

plt.show() 

new chart

+0

すばらしい、完全なイラストで素晴らしい答えです!とても感謝しています! –

+2

マイナーな修正です。上記のコードは 'x = np.arange(1,101)'と読みます。 –

+0

これは線を描くのではなく、線分だけを描きます。どのように2つの点を投げたのかという疑問は未解決のままです。 – Alexey

30

import numpy as np 
np.random.seed(5) 
x = arange(1, 101) 
y = 20 + 3 * x + np.random.normal(0, 60, 100) 
p = plot(x, y, "o") 
vlines(70,100,250) 

基本呼署名は、次のとおりです。

vlines(x, ymin, ymax) 
hlines(y, xmin, xmax) 
+2

これは優れています。私は 'vline()'や 'hline()'関数を見ていませんでした。対角線はどうですか?私はあなたに私にh&vの線を示したので、対角線のビットを追加する質問を編集しました。 –

+0

x、y座標を含む 'DataFrame'を作って' style = 'k-''でプロットしてみてください –

+0

ありがとう、それはとても便利です – Alex

35

それは新参者のために手遅れではありません。

plt.axvline(x, color='r') 

http://matplotlib.org/api/pyplot_api.html#matplotlib.pyplot.axvline

はYMINとYMAXを使用して、同様にYの範囲をとります。

+1

axhlineとaxvlineの最小/最大パラメータは、0と1の間のスカラー値で、プロットの端を基準にプロットします。良いツールではありますが、注釈行を描画する際の問題のステートメントに対する最良の解決策ではないでしょう。 – binarysubstrate

+1

これは、グラフ全体にまたがる背景に注釈行を追加したい場合に最適です。上記の解を使ってx = 1に垂直線を描画すると、最小値と最大値を指定しなければならず、プロットは自動的にバッファでリサイズされるため、プロット全体に線が伸びません。それは面倒です。これはよりエレガントでプロットのサイズを変更しません。 – Bonnie

1

Matplolibは、OPが探していたときに「注釈行」を使用できるようになりました。 annotate()機能は、いくつかの形態の接続経路を可能にし、ヘッドレスおよびテールレスの矢印、すなわち単純な線がそれらの1つである。 the documentation

ax.annotate("", 
      xy=(0.2, 0.2), xycoords='data', 
      xytext=(0.8, 0.8), textcoords='data', 
      arrowprops=dict(arrowstyle="-", 
         connectionstyle="arc3, rad=0"), 
      ) 

それはあなたが最初の引数として空の文字列を持つ唯一の矢印を描くことができると言います。 OPの例から

%matplotlib notebook 
import numpy as np 
import matplotlib.pyplot as plt 

np.random.seed(5) 
x = np.arange(1, 101) 
y = 20 + 3 * x + np.random.normal(0, 60, 100) 
plt.plot(x, y, "o") 


# draw vertical line from (70,100) to (70, 250) 
plt.annotate("", 
       xy=(70, 100), xycoords='data', 
       xytext=(70, 250), textcoords='data', 
       arrowprops=dict(arrowstyle="-", 
           connectionstyle="arc3,rad=0."), 
      ) 

# draw diagonal line from (70, 90) to (90, 200) 
plt.annotate("", 
       xy=(70, 90), xycoords='data', 
       xytext=(90, 200), textcoords='data', 
       arrowprops=dict(arrowstyle="-", 
           connectionstyle="arc3,rad=0."), 
      ) 

plt.show() 

Example inline image

だけgcalmettesの答えでのアプローチのように、あなたが色、線幅、線種などを選択することができます。..

ここでは、2つのサンプルラインの1つを赤、幅広、100%不透明にしないコードの部分を変更しています。

# draw vertical line from (70,100) to (70, 250) 
plt.annotate("", 
       xy=(70, 100), xycoords='data', 
       xytext=(70, 250), textcoords='data', 
       arrowprops=dict(arrowstyle="-", 
           edgecolor = "red", 
           linewidth=5, 
           alpha=0.65, 
           connectionstyle="arc3,rad=0."), 
      ) 

connectionstyleを調整して接続線にカーブを追加することもできます。

関連する問題