2017-11-21 7 views
-3

私はPythonの初心者であり、ある軸Xでいくつかのカップル(x、y)を区間の形でプロットしようとしています。たとえば、次のカップル(2,3)、(2,4)、(4,4)、(1,3)がある場合は、下の図のグラフを作成する必要があります。間隔を1つの軸にプロットする方法

私はこのコードを試してみてくださいそれはあなたがbarhを使用している理由だから私はわからない私に

def DrawGraph (RM): 
    for i in range(0,RM.shape[0]-1): 
     c1=lastOne2(RM,i) 
     ax1=plt.subplot(1,1,1) 
     if c1[0] == c1[1]: 
      plt.plot(c1[0],c1[1],'ro') 
     if c1[0] < c1[1]: 
      ax1.barh(c1[0], c1[1], height=0.05) 
     if c1[0] > c1[1]: 
      ax1.barh(c1[1], c1[0], height=0.05) 
    return plt 

desired output

+0

あなたには、いくつかのコードを自分で書いてみましたがありますか?もしそうなら、あなたが今まで持っているものを投稿してください。 – alexblae

+0

私はそれを編集します、助けてくれてありがとう –

答えて

0

を正しい結果を与えるものではありません。私はそれがちょうど法線を使用し、いくつかのyの値を作成する方が簡単な方法だと思う。それ以外にも、これはあなたが望むものを得るはずです。 を使用して、任意のキーワード引数をplt.plotと指定できます。また、deltaYでは、水平線がどれだけ離れているかを調整することができます。

# Import 
import matplotlib.pyplot as plt 
import numpy as np 

def DrawGraph(RM,deltaY=1,**kwargs): 

    # Create figure 
    ax=plt.subplot(1,1,1) 

    for i in range(0,RM.shape[0]): 

     # Grab current interval 
     c1=RM[i] 

     # Create y-values and shift intervals up by (i+1)*deltaY 
     y=(i+1)*deltaY*np.ones((2,1)) 

     # Draw 
     if c1[0] == c1[1]: 
      ax.plot([c1[0]],[i*deltaY],'o',**kwargs) 
     if c1[0] < c1[1]: 
      ax.plot(c1,y,**kwargs) 
     if c1[0] > c1[1]: 
      ax.plot(c1,y,lw=lw,**kwargs) 

    # Set ylim so it looks nice 
    ax.set_ylim([0,deltaY*(i+2)]) 

    return ax 

# Define intervals 
intervals=np.array([(2,3),(2,4),(4,4),(1,3)]) 


# Plot 
DrawGraph(intervals,lw=5,c='b') 

# Draw 
plt.show() 

これは、あなたが

enter image description here

+0

ありがとう、それは完璧に動作します –

0

単純なループで十分です取得します。

import matplotlib.pyplot as plt 
import numpy as np 
p = [(2,3),(2,4),(4,4),(1,3)] 

def drawp(p, dy=1,**kw): 
    for i,x in enumerate(p): 
     plt.plot(np.unique(x),[i*dy]*len(np.unique(x)), 
       marker="s"*(2-len(np.unique(x))), ms=kw.get("lw",2),**kw) 

drawp(p, color="crimson") 

plt.show() 

enter image description here

関連する問題