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

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

新規登録して質問してみよう
ただいま回答率
85.48%
Matplotlib

MatplotlibはPythonのおよび、NumPy用のグラフ描画ライブラリです。多くの場合、IPythonと連携して使われます。

Python

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

Q&A

解決済

1回答

569閲覧

Python グラフ作成について

watchdogs

総合スコア54

Matplotlib

MatplotlibはPythonのおよび、NumPy用のグラフ描画ライブラリです。多くの場合、IPythonと連携して使われます。

Python

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

0グッド

0クリップ

投稿2020/08/16 10:16

Pythonでグラフ作成の際に近似式を表示したいのですが、どのように書けば良いかわかりません。
教えて下さい。
よろしくお願い致します。

下記がプログラムです。
テキストファイルからデータを読み取ってグラフを作成しています。
近似式はpolyfitを使用して作成しています。
この近似式をグラフ内部に表記したいです。

Python

1import pandas as pd 2import csv 3import numpy as np 4import matplotlib.pyplot as plt 5npArray = np.loadtxt("./01.txt", delimiter = ",") 6 7x = npArray[:, 0] 8y = npArray[:, 1] 9 10plt.rcParams["ytick.direction"] = "in" 11plt.rcParams["xtick.direction"] = "in" 12plt.gca().yaxis.set_major_formatter(plt.FormatStrFormatter("%.1f")) 13plt.gca().xaxis.set_major_formatter(plt.FormatStrFormatter("%.1f")) 14plt.rcParams["font.family"] ='sans-serif' 15plt.rcParams["xtick.major.width"] = 1.0 16plt.rcParams["ytick.major.width"] = 1.0 17plt.rcParams["font.size"] = 8 18plt.rcParams["axes.linewidth"] = 1.0 19plt.ylabel("V(V)") 20plt.xlabel("t(s)") 21 22#近似式の係数 23res1=np.polyfit(x, y, 8) 24y1 = np.poly1d(res1)(x) 25 26 27 28#グラフ表示 29plt.scatter(x, y, label='Orignal') 30plt.plot(x, y1, color ='red', label='1st order') 31plt.legend() 32plt.show() 33

これで下記のようなぐらふが作成されます。
赤い線で近似された線の多項近似式を表示したいです。

イメージ説明

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

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

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

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

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

can110

2020/08/16 10:33

「多項近似式を表示」というのがよく分かりません。係数(数値)を確認表示したいということでしょうか?
watchdogs

2020/08/16 11:01

can110様 コメントありがとうございます。 赤い線で表記しているグラフの波形の式を表示したいという意味です。
guest

回答1

0

ベストアンサー

numpy.polyfit — NumPy v1.19 Manual

polyfit() の返り値が表す近似式を確認したいのであれば、以下のように print() すればいいと思います。

eq = " + \n".join(f"{a:10.2e} x^{len(res1) - i}" for i, a in enumerate(res1, 1)) print(eq)
-5.52e-04 x^8 + -1.61e-03 x^7 + 1.09e-02 x^6 + 1.33e-02 x^5 + -6.56e-02 x^4 + 1.07e-02 x^3 + 1.27e+00 x^2 + -1.75e-01 x^1 + -4.11e-01 x^0

8次の式となると以上のように長くなってしまうので、グラフ中に描画することは視認性が悪くなり、おすすめできません。

追記

plt.text(x, y, テキスト) で位置 (x, y) にテキストを表示できます。
位置は適宜変更してください

python

1import pandas as pd 2import csv 3import numpy as np 4import matplotlib.pyplot as plt 5 6 7x = np.linspace(0, 2, 15) 8y = np.sin(x) + np.random.normal(scale=0.05, size=len(x)) 9 10plt.rcParams["ytick.direction"] = "in" 11plt.rcParams["xtick.direction"] = "in" 12plt.gca().yaxis.set_major_formatter(plt.FormatStrFormatter("%.1f")) 13plt.gca().xaxis.set_major_formatter(plt.FormatStrFormatter("%.1f")) 14plt.rcParams["font.family"] = "sans-serif" 15plt.rcParams["xtick.major.width"] = 1.0 16plt.rcParams["ytick.major.width"] = 1.0 17plt.rcParams["font.size"] = 8 18plt.rcParams["axes.linewidth"] = 1.0 19plt.ylabel("V(V)") 20plt.xlabel("t(s)") 21 22# 近似式の係数 23res1 = np.polyfit(x, y, 8) 24y1 = np.poly1d(res1)(x) 25 26eq = " + \n".join(f"{a:10.2e} x^{len(res1) - i}" for i, a in enumerate(res1, 1)) 27print(eq) 28 29# グラフ表示 30plt.text(0, 1.12, eq, fontsize=15) 31plt.scatter(x, y, label="Orignal") 32plt.plot(x, y1, color="red", label="1st order") 33plt.legend() 34plt.show()

イメージ説明

投稿2020/08/16 10:53

編集2020/08/16 11:53
tiitoi

総合スコア21956

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

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

watchdogs

2020/08/16 11:03

ご回答ありがとうございます。 グラフ内部に表示するとすればどのように描けば良いでしょうか。
tiitoi

2020/08/16 11:53

追記しました。plt.text(x, y, テキスト) でグラフ中にテキストを表示できます。
watchdogs

2020/08/16 13:20

ご対応ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問