質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

87.92%

時系列ベクトル図の作成方法について(python)

解決済

回答 1

投稿

  • 評価
  • クリップ 6
  • VIEW 3,682

score 18

 前提・実現したいこと

pythonに限らずプログラミング自体が初心者です。
至らぬ点が多々ありますが何卒よろしくお願い致します。

海流や風速の時系列データから以下のようなグラフをpythonで作成したいのですが、
やり方がわからずに苦しんでいます。
初心者用の本は読んだりしているのですが、参考になる記述が少ない状況です。

![イメージ説明
!イメージ説明

以下のような、流速(cm/s)と流れる方向(360°表記:北0度~東90度~南180度~西270度~)を
10分毎に計測したデータのcsvファイルをpandasを用いて読み込みます。

日時    流速    流向
2018/5/29 13:20  22.3  18.9
2018/5/29 13:30  22.3  28.4
2018/5/29 13:40  24.2  36.4
2018/5/29 13:50  24.9  38.6
2018/5/29 14:00  25.7  39.7
2018/5/29 14:10  24.5  41.3
・・・・・・・・・・・・・・・
2018/10/18 11:00 23.3  355.9 

それをnumpyでベクトルを成分に分けます。

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt

#
df = pd.read_csv('ocean_current.csv',encoding='ANSI')
dt = df['日時']
a = df['流速']
b = df['流向']

#
x = np.sin(b)
y = np.cos(b)

u = a*x
v = a*y

#
fig,ax = plt.subplots(1, 1, figsize=(16,6))


ここから先どのようにしたら良いのかがわかりません。
ベクトルを扱うax.quiverやax.quiverkeyに軽く触れられているページは多くありましたが、
細かく解説してある本やページが無くて苦しんでいます。
特に日時の扱いに苦慮しております。

漠然としたご質問で大変申し訳ありませんが、
どなたかご教授頂けませんでしょうか?

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 1

checkベストアンサー

+3

ご提示の図を一発で描画できる関数は matplotlib に用意されていないので、複数の機能を組み合わせて描画する必要があります。
以下、概念実証用のサンプルコードです。
提示された図に近づけるには、

  • X 軸のラベルを日付ごとに表示する。set_xticklabels(), set_xticks() で調整
  • 矢印の太さ quiver() のパラメータで調整
  • 図のアスペクト比 figsize で調整
  • N, S, <2002/1021/ ~ ...> というラベル ax.text() で配置

など調整してみてはどうでしょうか。

DateTime,Speed,Orient
2018/5/29 13:20,22.3,18.9
2018/5/29 13:30,22.3,28.4
2018/5/29 13:40,24.2,36.4
2018/5/29 13:50,24.9,38.6
2018/5/29 14:00,25.7,39.7
2018/5/29 14:10,24.5,1.3
2018/5/29 14:20,24.5,1.3
2018/5/29 14:30,24.5,1.3
2018/5/29 14:40,24.5,1.3
2018/5/29 14:50,24.5,1.3
import matplotlib.pyplot as plt
import numpy as np
import pandas as pd
from datetime import datetime

df = pd.read_csv('data.txt', parse_dates=[0])

# ベクトル
u = df['Speed'] * np.sin(df['Orient'])
v = df['Speed'] * np.cos(df['Orient'])

# ベクトルの起点
time_len = len(df['DateTime'])
x = np.arange(time_len)
y = np.zeros(len(x))

# x 軸のラベル
dt_labels = [dt.strftime('%H:%M') for dt in df['DateTime']]

fig, ax = plt.subplots(figsize=(8, 4))
ax.quiver(x, y, u, v, angles='xy', scale_units='xy', width=0.004)
# x 軸のラベル
ax.set_xticklabels(dt_labels, rotation=30, fontsize='small')
# y = 0 に直線を引く。
ax.axhline(color='black', linewidth=1)
# x, y 軸のラベル
ax.set_xlabel('Speed')
ax.set_ylabel('Datetime')

イメージ説明

ベクトルを扱うax.quiverax.quiverkeyに軽く触れられているページは多くありましたが、
細かく解説してある本やページが無くて苦しんでいます。
特に日時の扱いに苦慮しております。

matplotlib は非常にカスタマイズ製が高いので、作ろうと思えば、どんな図でも基本的に作れます。
書籍や Web サイトでは基本的な使い方しか載っていないので、公式ドキュメントを参考にするのがよいでしょう。

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/10/18 16:26 編集

    ご回答頂き、ありがとうございました。
    何をどうしてよいか全くわからない中、少し前進できたと思います。
    しかし、まだまだ道は遠く描くことができません。
    概念実証用のコードを試させて頂きましたが、サンプルとして表示されている物も描けませんでした。

    #ベクトルの起点までは理解できましたが、
    次の#X軸のラベルで以下のエラーがでました。
    AttributeError: 'str' object has no attribute 'strftime'
    どうしてstr型のデータなのにstrftimeに対応していないのでしょうか?

    それから公式ドキュメントとは、https://docs.python.jp/3/index.html
    ここを指しているのでしょうか?

    質問ばかりで申し訳ありません。
    数冊の本でpythonを勉強しましたが、できるようになる将来が全く想像できないでおり、
    ここに至ったというわけです。
    諦めずなんとか少しずつでも解決に向かいたいと思いますので、
    どうぞよろしくお願い致します。

    キャンセル

  • 2018/10/18 16:38 編集

    pandas でCSVを読み込む際にデフォルトでは、日時のカラムも str として読み込まれてしまうので、以下のように 0 列目は日時として解釈するよう明示的に指定してあげることで datetime 型として読み込れます。

    ```
    df = pd.read_csv('data.txt', parse_dates=[0])
    ```

    それから公式ドキュメントとは、ここを指しているのでしょうか?

    matplotlib のリファレンスです。
    https://matplotlib.org/index.html

    また、「matplotlib やりたいこと (英語)」で検索すると、Stack Overflow が大抵引っかかりますので、検索する際の参考にしてください。

    キャンセル

  • 2018/10/18 20:07

    ご回答頂きありがとうございます、おかげでまた一歩前進することができました。
    ご教授頂きましたax.quiver(x, y, u, v, angles='xy', scale_units='xy', width=0.004)のうち、
    angles='xy', scale_units='xy'の部分を削除したらそれらしい並びが出来上がりました。
    何故そうなったのかは自分の頭ではまだ理解できていませんが…
    まだ縦軸と横軸の目盛がおかしく、課題が多いのですが、コメントが下に膨らんでいくと
    見にくいため、ここで一旦切らせて頂きたいと思います。

    公式マニュアルは英語なんですね…英語力に乏しいので、またすぐ質問することになるでしょうが、
    何卒よろしくお願い致します。この度はありがとうございました。

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 87.92%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る