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

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

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

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

NumPy

NumPyはPythonのプログラミング言語の科学的と数学的なコンピューティングに関する拡張モジュールです。

Python

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

pandas

Pandasは、PythonでRにおけるデータフレームに似た型を持たせることができるライブラリです。 行列計算の負担が大幅に軽減されるため、Rで行っていた集計作業をPythonでも比較的簡単に行えます。 データ構造を変更したりデータ分析したりするときにも便利です。

Q&A

解決済

2回答

9547閲覧

matplotlibを使用したグラフ表示で条件による背景色変更を行いたい。

python_Beginner

総合スコア5

Matplotlib

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

NumPy

NumPyはPythonのプログラミング言語の科学的と数学的なコンピューティングに関する拡張モジュールです。

Python

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

pandas

Pandasは、PythonでRにおけるデータフレームに似た型を持たせることができるライブラリです。 行列計算の負担が大幅に軽減されるため、Rで行っていた集計作業をPythonでも比較的簡単に行えます。 データ構造を変更したりデータ分析したりするときにも便利です。

0グッド

0クリップ

投稿2019/08/21 07:04

前提・実現したいこと

pythonのmatplotlibを使用してグラフ表示アプリを作成しています。
0~50までのランダムな数値が入っているデータフレームがあり、それを折れ線グラフで表示する。
グラフ上で、通常背景色は白で、25以下の値の背景色は黄色に、
25以下が5個以上続く場合には背景色をオレンジにするという条件があります。

発生している問題・エラーメッセージ

1)下記に記述する現在の方法でも背景色が変わっているように見えるのですが、強引すぎるやり方で効率悪いかと思います。 別の単純なやり方があれば教えてください。 2)現在の手順だとグリッドが最背面にあり、黄色、オレンジの部分はメモリ線が見えなくなる状況です。 vlinesを最背面にする方法、もしくはgridを最前面にする方法があれば教えてください。

該当のソースコード

Python

1import pandas as pd 2import matplotlib.pyplot as plt 3import numpy as np 4 5def main(): 6  df = pd.DataFrame(np.random.randint(0,50,size=(1000,1)),columns=list('A')) 7 8  df2 = df[df['A']<=25] 9  df2 = df2.reset_index() 10  df2['diff'] = df2['index'].diff() 11 12  cnt = 0 13  df2['オレンジ'] = 0 14  for i in range(len(df)): 15    if df2['diff'].get(i,None) == 1.0: 16      cnt += 1 17      if cnt >= 5: 18        df2.loc[i-5:i,'オレンジ'] = df2.loc[i-5:i,'index'] 19    else: 20      cnt = 0 21 22  fig = plt.figure() 23  plt.grid(b=None, which='both', axis='both') 24  plt.plot(df['A'],color='blue') 25  plt.vlines(df2['index'],0,50,color='yellow') 26  plt.vlines(df2['オレンジ'],0,50,color='orange') 27 28  plt.show() 29if __name__ == '__main__': 30  main()

試したこと

グラフ表示部は、背景色が変わった風に見せるために縦線を描いている状況です。

補足情報(FW/ツールのバージョンなど)

Python 3.7.3
matplotlib : 3.0.3

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

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

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

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

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

guest

回答2

0

ベストアンサー

下記に記述する現在の方法でも背景色が変わっているように見えるのですが、強引すぎるやり方で効率悪いかと思います。

値1つごとに背景を決める必要があるので、特に問題があるように思えません。
vlines でよいと思います。

現在の手順だとグリッドが最背面にあり、黄色、オレンジの部分はメモリ線が見えなくなる状況です。

vlinesを最背面にする方法、もしくはgridを最前面にする方法があれば教えてください。

set_axisbelow(False) を設定することで、目盛り、グリッドを前面に表示できます。

matplotlib.axes.Axes.set_axisbelow — Matplotlib 3.1.0 documentation

python

1import pandas as pd 2import matplotlib.pyplot as plt 3import numpy as np 4 5 6def main(): 7 df = pd.DataFrame(np.random.randint(0, 50, size=(1000, 1)), columns=["A"]) 8 9 df2 = df[df["A"] <= 25] 10 df2 = df2.reset_index() 11 df2["diff"] = df2["index"].diff() 12 13 cnt = 0 14 df2["オレンジ"] = 0 15 for i in range(len(df)): 16 if df2["diff"].get(i, None) == 1.0: 17 cnt += 1 18 if cnt >= 5: 19 df2.loc[i - 5 : i, "オレンジ"] = df2.loc[i - 5 : i, "index"] 20 else: 21 cnt = 0 22 23 fig = plt.figure(figsize=(10, 5)) 24 plt.gca().set_axisbelow(False) 25 plt.grid(b=None, which="both", axis="both", color="k") 26 plt.plot(df["A"], color="blue", lw=0.5) 27 28 plt.vlines(df2["index"], 0, 50, color="yellow") 29 plt.vlines(df2["オレンジ"], 0, 50, color="orange") 30 31 plt.show() 32 33 34if __name__ == "__main__": 35 main()

投稿2019/08/21 07:52

tiitoi

総合スコア21956

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

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

0

  • 25以下の開始~終了のx位置=yellowの範囲
  • 25以下が5個以上続く開始~終了のx位置=orangeの範囲

をコードでうまく特定する処理が書ければ、あとはaxvspanで指定範囲を塗りつぶせます。
参考:Different background colour areas on matplotlib plot

以下は単純な例です。

Python

1import matplotlib.pyplot as plt 2 3# サンプルデータ 4y = [28,24,30,24,23,22,21,20,19,29,30] 5x = list(range(len(y))) 6 7fig, ax = plt.subplots() 8ax.plot(x, y, 'k') 9ax.grid() 10 11# 範囲は手作業で適当にセット 12ax.axvspan(0.5, 1.5, facecolor='yellow', alpha=0.5) 13ax.axvspan(2.5, 8.5, facecolor='orange', alpha=0.5) 14 15plt.show()

イメージ説明

投稿2019/08/21 07:44

can110

総合スコア38339

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.37%

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

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

質問する

関連した質問