2017-04-25 22 views
3

私はカーブの隣に矢印が欲しいです。たとえば:matplotlibのカーブの最後にどのように矢印を置くことができますか?

import numpy as np 
import matplotlib.pyplot as plt 

X = np.linspace(0,4*np.pi,10000) 
Y = np.sin(X) 

shift = 0.1 
seg_size = 300 

i = 0 
plt.plot(X,Y,color='blue') 
while i +seg_size < len(X): 
    x = X[i:i+seg_size] 
    y = Y[i:i+seg_size]+shift 
    plt.plot(x,y,color='black') 
    #input here command for arrow head 
    i += seg_size*2 

plt.show() 

私はカーブの終わりに行の次の角度を計算し、矢印のヘッドラインをプロットしてみましたが、私は何か間違ったことだし、矢印頭部が変形しています。何かヒント?

答えて

0

どう

numpy.annotate() 

機能を使用してはどうですか?

https://matplotlib.org/examples/pylab_examples/annotation_demo.html

+0

'' numpy''または '' pyplot''?あなたが与えたリンクは後者のためのものであり、曲線を矢印に変えることはできません。直線のみです。 – Yotam

+0

私たちがカーブの終点をとり、パイプロアノテーション(矢印)の開始点として使用すると機能しますか? –

+1

はい、私は何か似たようなことをしました、曲線が常に線形に近いとは限らないので、その点は遠すぎることはできない – Yotam

1

FancyArrowPatchクラスが引数としてパスを取るので、私はあなたがそれを使用することができることを考えた:

はこちらpyplot.annotate()関数によって作成された矢印の例を参照してください。

1)各ラインセグメントに対して、matplotlib.path.Pathインスタンスを作成します。

2)パスのインスタンスを使用して矢印を描きます。

import numpy as np 
import matplotlib.pyplot as plt; plt.ion() 
from matplotlib.patches import FancyArrowPatch, PathPatch 
from matplotlib.path import Path 

def create_path(x,y): 
    vertices = zip(x,y) 
    codes = [Path.MOVETO] + (len(vertices)-1) * [Path.CURVE3] 
    return Path(vertices, codes) 

X = np.linspace(0,4*np.pi,10000) 
Y = np.sin(X) 

fig, ax = plt.subplots(1,1) 
ax.plot(X,Y,color='blue') 

shift = 0.1 
seg_size = 300 

i = 0 
while i +seg_size < len(X): 
    x = X[i:i+seg_size] 
    y = Y[i:i+seg_size]+shift 

    path = create_path(x,y) 

    # for testing path 
    # patch = PathPatch(path, facecolor='none', lw=2) 
    # ax.add_patch(patch) 

    arrow = FancyArrowPatch(path=path, color='r') 
    ax.add_artist(arrow) 

    i += seg_size*2 

残念ながら、それは2つの以上のセグメントを有することができないFancyArrowPatchに渡される経路として、動作しない(文書化されていないが、チェックがensure_quadratic_bezierです)。

だから、あなたはカンニングしなければなりません。以下では、矢印を描くために各セグメントの最後の2つの点を使用します。

import numpy as np 
import matplotlib.pyplot as plt; plt.ion() 
from matplotlib.patches import FancyArrowPatch 

X = np.linspace(0,4*np.pi,10000) 
Y = np.sin(X) 

fig, ax = plt.subplots(1,1) 
ax.plot(X,Y,color='blue') 

shift = 0.1 
seg_size = 300 

i = 0 
while i +seg_size < len(X): 
    x = X[i:i+seg_size] 
    y = Y[i:i+seg_size]+shift 

    ax.plot(x, y, 'k') 

    posA, posB = zip(x[-2:], y[-2:]) 
    edge_width = 2. 
    arrowstyle = "fancy,head_length={},head_width={},tail_width={}".format(2*edge_width, 3*edge_width, edge_width) 
    arrow = FancyArrowPatch(posA=posA, posB=posB, arrowstyle=arrowstyle, color='k') 
    ax.add_artist(arrow) 

    i += seg_size*2 

enter image description here

関連する問題