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

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

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

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

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Q&A

受付中

横軸にある週末日付を削除したら、matplotlibでまともなグラフを描けなくなった。

biginner999
biginner999

総合スコア7

Matplotlib

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

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

1回答

0グッド

0クリップ

198閲覧

投稿2022/11/14 02:58

(バージョン情報)
python・・・3.9.7
numpy・・・1.20.3
pandas・・・1.3.4
matplotlib・・・3.4.3
(やりたいこと)
・以下のようなフォーマットのデータをもとに、USDJPY(為替レート)を左軸、index1、index2を右軸にプロットした2軸グラフを書きたい。
utc_datetime instrument close index1 index2
0 2022-08-01 00:00:00+00:00 USDJPY 133.366 0.008349 0.018714
1 2022-08-01 00:01:00+00:00 USDJPY 133.341 0.008417 0.018710
2 2022-08-01 00:02:00+00:00 USDJPY 133.355 0.008485 0.018707
・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・
「土日抜き」の分単位のデータが20営業日分、つまり1440×20=28800レコードあります。

(悩み)
週末はデータがないにもかかわらず、matplotlibで描画すると金曜日の一番最後のデータと月曜日の一番最初のデータを勝手に直線で結んでしまう。

(やってみたこと)
①df[“utc_datetime”]を以下のコマンドで文字列化。
df["str_date"] = df["utc_datetime"].dt.strftime("%Y/%m/%d %H:%M")
②以下のコマンドで、x軸ラベルを2880間隔にする。
ax1.xaxis.set_major_locator(ticker.MultipleLocator(2880))

(結果)
下記のコマンドを走らせた結果、
・10分以上たっても反応を返さなくなった。(15分経ってようやく描画)
・軸目盛が2880間隔にならず、x軸が全データ表示によりつぶれている。
・グラフ領域がグレーで塗りつぶされてしまった。
・どこが悪かったのか、アドバイスをいただけると幸甚です。

(失敗コード)

2軸グラフ設定

fig = plt.figure(figsize=(8, 6))
ax1 = fig.add_subplot(1, 1, 1)
ax2 = ax1.twinx()

x, y軸データ

x = df["str_date"]
y1 = df["close"]
y2 = df[ df.columns[num1] ]
y3 = df[ df.columns[num2] ]

色と凡例

c1, c2, c3 = "tab:blue", "tab:orange", "tab:green" # 各プロットの色
l1, l2, l3 = currency, "index1", "index2" # 各ラベル

1つ目のグラフを描画

g_title = currency + " vs index " + " (" + country + ")"
ax1.xaxis.set_major_locator(ticker.MultipleLocator(2880))
ax1.set_title(g_title) # グラフタイトル
ax1.grid() # 罫線
ax1.xaxis.set_tick_params(rotation = 90)
ax1.plot(x, y1, color = c1,label=l1)
h1, l1 = ax1.get_legend_handles_labels()

2つ目のグラフを描画

ax2.plot(x, y2, color = c2, label = l2, linewidth = 0.5)
ax2.plot(x, y3, color = c3, label = l3, linewidth = 0.5)
plt.fill_between(x, y2, y3, facecolor = "gray", alpha = 0.3)
h2, l2 = ax2.get_legend_handles_labels()

ax1.legend(h1+h2, l1+l2)
plt.show()

以下のような質問にはグッドを送りましょう

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

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

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

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

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

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

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

適切な質問に修正を依頼しましょう。

回答1

0

x軸をstr型にするとめちゃくちゃ遅くなります
途中にnanを入れるとそこで線が途切れるので土日どっちかに空白のデータを入れてみて下さい

投稿2022/11/14 05:28

Sobasenbei

総合スコア107

良いと思った回答にはグッドを送りましょう。
グッドが多くついた回答ほどページの上位に表示されるので、他の人が素晴らしい回答を見つけやすくなります。

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

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

このような回答には修正を依頼しましょう。

回答へのコメント

biginner999

2022/11/14 08:29

ご回答ありがとうございます。 nanを入れてみたところ、 'value' must be an instance of str or bytes, not a float とうエラーが出ました。
Sobasenbei

2022/11/14 08:54

nanをどのように追加しましたか?
biginner999

2022/11/15 01:03

以下のような方法で、3000レコードごとに軸ラベルが表示できないか、と考えました。すると 'value' must be an instance of str or bytes, not a float というエラーが出ました。 df["str_date_2"] = np.nan for i in range(0, len(df), 3000): df.loc[i, "str_date_2"] = df.loc[i, "str_date"] x = df_["str_date_2"] ・・・・
Sobasenbei

2022/11/15 02:12

ラベルはずっと左側、2つ目のは右側に表示されてると思いますが... 私はutc_datetime以外nanの行をdataframeに追加して、ソートで整えた後に型を変えずにmplに渡すという考えだったのですが違いましたか?
biginner999

2022/11/15 07:01

私がSobasenbei様のご提案を正しく実行できているかわからないのですが、線が途切れた状態で表示されますね。
Sobasenbei

2022/11/15 14:07

質問者さんが考えてるグラフとはまた違いますか

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

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

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

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

ただいまの回答率
86.02%

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

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

質問する

関連した質問

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

Matplotlib

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

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。