20170717

matplotlibのannotateのhead_widthを設定すると、エラーが返ってくる

matplotlibで矢印を描くときpyplot.annotateを使用する。

import matplotlib.pyplot as plt

plt.annotate("",
xy=(0.5, 0.5), xycoords='data',
xytext=(0, 0), textcoords='data',
arrowprops=dict(arrowstyle="->",
connectionstyle="arc3",
),
)

plt.show()

ここまでなら、公式サイトで手に入る。

20170716-02.png

pyplot.arrowよりも、こちらの方が、座標指定したところにきっちり線が書かれる点で優れている気がするが、煩雑なのが欠点。

矢じりの部分の大きさを変えたいと思ったので、検索すると、headwidth(もしくはhead_width)という引数を使うと変えられるような事が書いてあったので、実行したがエラーが返ってきた。
最終的には動かせるようになったので、メモ書きしておく。

症状、「headwidthなんてプロパティはない。」とエラーが返される。

import matplotlib.pyplot as plt

plt.annotate("",
xy=(0, v1), xycoords='data',
xytext=(0, v1*-1.0), textcoords='data',
arrowprops=dict(arrowstyle="->",head_width = 2, head_length = 1.5,connectionstyle="arc3")
)

plt.show()

まんま、ここの事ですが

AttributeError: Unknown property headwidth

もしくは

AttributeError: Unknown property head_width

が出てしまう。
「バージョンの違いか?それとも、head_widthとかスペルミスしてるのか?」
とか思ったが、使い方を間違えていただけだった。

headwidthは、annotateの中の引数ではない。

head_widthはどこに入れるべきだったのか?

headwidthは、

  1. annotateの中の、
  2. arrowpropsの中で、
  3. dict()の中の、
  4. arrowstyleの中に入れる

更に言うと、arrowstyleで

'<->’

とかを使用するのであれば、

'<->, head_width=15’

とかしなければならない。

お気づきでしょうか?全て文字列なのです。
headwidth=15とかの部分は、全て文字列として指定しなければならないのです。
矢印の先端の形状を決める引き数を書き終わったら、文字列を締めくくらずに、続けて書かないといけないのです。

正しいコードは

import matplotlib.pyplot as plt

plt.annotate("",
xy=(0.5, 0.5), xycoords='data',
xytext=(0, 0), textcoords='data',
arrowprops=dict(arrowstyle="->, head_width = 2, head_length = 3",
connectionstyle="arc3",
),
)

plt.show() 
20170716-01.png
こうなった。結構、不格好。
posted by yuchan at 07:00 | Comment(0) | python
この記事へのコメント
コメントを書く
お名前:

メールアドレス:

ホームページアドレス:

コメント: