🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

1回答

2419閲覧

pythonにて、計算結果をグラフに表す方法について

sa-to

総合スコア2

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

1クリップ

投稿2020/11/28 04:23

編集2020/11/28 05:23

前提・実現したいこと

人工衛星の軌道計算を行っており、時刻に対する高度の推移のグラフを作りたいです。

該当のソースコード

from skyfield.api import Topos, load, EarthSatellite from datetime import datetime, timedelta from pytz import timezone ts = load.timescale() tokyo = Topos('35.65870 N', '139.74539 E') line1 = '1 25544U 98067A 20226.06311231 .00000634 00000-0 19556-4 0 9992' line2 = '2 25544 51.6462 66.9823 0001637 29.7739 108.2756 15.49160058240839' iss = EarthSatellite(line1, line2, 'ISS (ZARYA)', ts) t0 = ts.utc(2020, 11, 1, 0, 0, 0) with open("resalt.txt", mode='w') as f: for s in range(600): t1 = ts.utc(t0.utc_datetime() + timedelta(seconds=s)) alt, az, distance = (iss - tokyo).at(t1).altaz() print('時刻:', t1.utc_strftime("%Y %b %d %H:%M:%S"), '高度:{0:.1f} 度'.format(alt.degrees), file=f)

試したこと

計算結果をテキストファイルとして保存し、それを読み込みmatplotlibでグラフ化しようとしています。

計算結果のテキストは下記のようにテキストファイルに書き込まれています。
時刻: 2020 Nov 01 00:32:51 高度:0.0 度
時刻: 2020 Nov 01 00:32:52 高度:0.1 度
時刻: 2020 Nov 01 00:32:53 高度:0.1 度
時刻: 2020 Nov 01 00:32:54 高度:0.2 度

カンマ区切りの方がやりやすいのでしょうか

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

skyfieldを初めて知り面白そうだったので書いてみました。
ISSは約90分で地球を一周するので、1分おきに90分間の方位角と高度をプロットしました。
satellites(ISS [ZARYA]) の取得を変更しました。

◎以下追加
変数gtypeに以下のように設定すると、それぞれのグラフを出力します。
az-alt : x軸=方位角 y軸=高度
time-alt : x軸=時刻 y軸=高度(先頭30個のみ)

python

1from skyfield.api import Topos, load 2from datetime import timedelta 3import matplotlib.pyplot as plt 4import pandas as pd 5import japanize_matplotlib 6 7ts = load.timescale() 8tokyo = Topos('35.65870 N', '139.74539 E') 9satellites = load.tle('http://celestrak.com/NORAD/elements/stations.txt') 10iss = satellites['ISS (ZARYA)'] 11t0 = ts.utc(2020, 11, 1, 0, 0, 0) 12with open("result.csv", mode='w') as f: 13 print('time,alt,az', file=f) 14 for s in range(0, 5400, 60): 15 t1 = ts.utc(t0.utc_datetime() + timedelta(seconds=s)) 16 alt, az, distance = (iss - tokyo).at(t1).altaz() 17 t = t1.utc_strftime("%Y/%m/%d %H:%M:%S") 18 alt_degree = alt.degrees # 高度(度) 19 az_degree = az.degrees # 方位角(度) 20 print('{},{},{}'.format(t, alt_degree, az_degree), file=f) 21 22df = pd.read_csv("result.csv") 23gtype = 'time-alt' # az-alt = x:方位角-y:高度 、 time-alt = x:time-y:高度 24if gtype == 'az-alt': 25 plt.axis([0, 360, -90, 90]) 26 x = df['az'] 27 y = df['alt'] 28 plt.scatter(x, y) 29 plt.plot(x, y) 30 plt.xlabel('方位角') 31 plt.ylabel('高度') 32 plt.title('ISS (ZARYA)の軌跡:2020/11/01 00:00:00(UTC) から90分間(60秒毎)') 33elif gtype == 'time-alt': 34 x = df['time'][0:30] 35 y = df['alt'][0:30] 36 plt.subplots_adjust(bottom=0.5) 37 plt.xticks(rotation=90) 38 plt.scatter(x, y) 39 plt.plot(x, y) 40 plt.xlabel('時刻') 41 plt.ylabel('高度') 42 plt.title('ISS (ZARYA)の時刻・高度:2020/11/01 00:00:00(UTC) から30個(60秒毎)') 43plt.show()

結果は以下のようになりました。
gtypeがaz-altの時
結果1

gtypeがtime-altの時
結果2

投稿2020/11/28 13:35

編集2020/11/29 03:50
ikapy

総合スコア1167

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

sa-to

2020/11/29 01:49

ありがとうございます! 時間と高度のグラフなどににしたい場合は、 x = df['az'] y = df['alt'] この部分を変更すれば良いのでしょうか?
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.36%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問