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

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

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

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

NumPy

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

Python

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

pandas

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

Q&A

解決済

2回答

3087閲覧

matplotlibで表示されるグラフで特定の数値の範囲内にある部分を色分けしたい。

wtxa111

総合スコア18

Matplotlib

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

NumPy

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

Python

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

pandas

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

0グッド

0クリップ

投稿2019/01/17 10:06

いつもお世話になっております。pythonのmatplotlibで
ベクトルのグラフを表示するquiverについてお尋ねしたいのですが。

datetime Cu Or
2018/9/4 0:00 27.6 31.5
2018/9/4 0:10 26.8 45.3
2018/9/4 0:20 27.9 41
2018/9/4 0:30 24.9 36.5
2018/9/4 0:40 30.8 26.8
・・・・・・・・・・・・・・・
2018/9/5 0:00 51.1 21.7

この並びのデータセットを用意して、以下のコードを実施するとベクトルのグラフが描かれます。

python

1#モジュールのインポート 2import matplotlib.pyplot as plt 3import pandas as pd 4import numpy as np 5 6#csvの読み込み 7df = pd.read_csv('sample.csv',encoding='ANSI',parse_dates=[0],index_col=[0]) 8 9#列データに記号を指定 10dt = df.index 11a = df['Cu'] 12b = df['Or'] 13 14#流向の度数→radian変換 15c = np.radians(b) 16u = a*np.sin(c) 17v = a*np.cos(c) 18 19#新しいデータフレームの作成 20df2 = pd.DataFrame({'x_element':u,'y_element':v}) 21#新データフレームの期間毎の平均値を求める(1Hour) 22df3 = df2.resample('10T').mean() 23#新データフレームの各列に記号を指定 24dt2 = df3.index 25u2 = df3['x_element'] 26v2 = df3['y_element'] 27 28#ベクトルの起点を設定 29time_len = len(df3) 30x = np.arange(time_len) 31y = np.zeros(len(x)) 32 33#グラフの格子を設定する 34fig, ax = plt.subplots(1,1,figsize=(10, 5)) 35 36#X軸の目盛を設定する 37dt_labels = [dt2.strftime('%m/%d') for dt2 in dt2] 38 39#ベクトル表示 40ax.quiver(x, y, u2, v2,width=0.001,scale_units='y',scale=1,\ 41 headlength=5, headwidth=5, headaxislength=5) 42 43#y軸の目盛を設定する 44ax.set_ylim(-50, 50) 45 46# 47plt.show()

ベクトルのグラフ

このグラフで棒矢印の長さ(つまりデータセットの項目[Cu])が50以上ある棒矢印は赤色に、
40以上50未満の棒矢印は黄色で表示したいとします。
その場合、どのような関数で条件設定をすると良いでしょうか?

また、色付きの棒を最前面で表示したいのですが可能でしょうか?
つまり棒同士が重なった場合、埋もれてしまわないように、
黒棒より黄色棒、さらに黄色棒より赤棒が前面に来るように条件設定したいのですが、
可能でしょうか?

初歩的な質問で申し訳ありませんが、どうぞよろしくお願い致します。

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

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

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

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

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

guest

回答2

0

厳密に色を指定しなくてよいなら、以下のようにカラーマップを利用するとそれらしくできます。

黒棒より黄色棒、さらに黄色棒より赤棒が前面に来るように条件設定したいのですが、

のやり方については分かりません。難しそうな気はします。

Python

1import numpy as np 2import matplotlib.pyplot as plt 3import matplotlib.cm as cm 4 5# 長さ5~100のベクトル 6N= 20 7x = range(N) 8y = [0]*N 9u = [0]*N 10v = [(i+1)*5 for i in range(N)] 11 12# colormap(cm.hot)に対応する位置を決定 13clr = [] 14for i in range(N): 15 c = 0 16 l = np.sqrt(u[i]**2 + v[i]**2) 17 if l >= 50: c = 0.3 # おおよそ赤色 18 elif l >= 40: c = 0.8 # おおよそ黄色 19 clr.append(c) 20 21colormap = cm.hot # 黒→赤→黄→白 22plt.quiver(x, y, u, v,color=colormap(clr)) 23plt.show()

イメージ説明

投稿2019/01/17 10:49

can110

総合スコア38233

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

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

wtxa111

2019/01/17 23:55

皆さんありがとうございました。 ただ、棒同士が重なった場合の前面優先は難しいみたいですね。 ひとまず解決とし、ベストアンサーを決めさせていただきました。
guest

0

ベストアンサー

quiver(X, Y, U, V, C, **kw) の第5引数 C に色のリストを指定することで、矢印ごとに色を設定できます。

色の一覧は以下のようにして作成すればよいです。

  1. サンプル数と同じ長さの配列を作成する。(値は black)
  2. df.Cu >= 50 の要素の値を赤にする。
  3. (40 <= df.Cu) & (df.Cu < 50) の要素の値を黄色にする。
colors = np.full(len(x), 'black') colors[df.Cu >= 50] = 'r' # 赤 colors[(40 <= df.Cu) & (df.Cu < 50)] = 'y' # 黄色

サンプルコード

python

1# モジュールのインポート 2import matplotlib.pyplot as plt 3import numpy as np 4import pandas as pd 5 6# csvの読み込み 7df = pd.read_csv('sample.csv', parse_dates=[0], index_col=[0]) 8 9# 列データに記号を指定 10dt = df.index 11a = df['Cu'] 12b = df['Or'] 13 14# 流向の度数→radian変換 15c = np.radians(b) 16u = a*np.sin(c) 17v = a*np.cos(c) 18 19# 新しいデータフレームの作成 20df2 = pd.DataFrame({'x_element': u, 'y_element': v}) 21# 新データフレームの期間毎の平均値を求める(1Hour) 22df3 = df2.resample('10T').mean() 23# 新データフレームの各列に記号を指定 24dt2 = df3.index 25u2 = df3['x_element'] 26v2 = df3['y_element'] 27 28# ベクトルの起点を設定 29time_len = len(df3) 30x = np.arange(time_len) 31y = np.zeros(len(x)) 32 33# グラフの格子を設定する 34fig, ax = plt.subplots(1, 1, figsize=(10, 5)) 35 36# X軸の目盛を設定する 37dt_labels = [dt2.strftime('%m/%d') for dt2 in dt2] 38 39# ベクトル表示 40colors = np.full(len(x), 'black') 41colors[df.Cu >= 50] = 'r' # 赤 42colors[(40 <= df.Cu) & (df.Cu < 50)] = 'y' # 黄色 43 44ax.quiver(x, y, u2, v2, color=colors, width=0.001, scale_units='y', scale=1, 45 headlength=5, headwidth=5, headaxislength=5) 46 47# y軸の目盛を設定する 48ax.set_ylim(-50, 50) 49 50# 51plt.show()

イメージ説明

投稿2019/01/17 10:29

tiitoi

総合スコア21956

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問