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

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

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

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

NumPy

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

Python 2.7

Python 2.7は2.xシリーズでは最後のメジャーバージョンです。Python3.1にある機能の多くが含まれています。

Q&A

解決済

1回答

2232閲覧

X軸の範囲によってプロットの色を変えたい

Penefax

総合スコア38

Matplotlib

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

NumPy

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

Python 2.7

Python 2.7は2.xシリーズでは最後のメジャーバージョンです。Python3.1にある機能の多くが含まれています。

0グッド

0クリップ

投稿2017/09/30 02:29

お世話になっております。

###前提・実現したいこと
2次元散布図において、x軸の範囲によってプロットの色を変えて同一グラフにプロットしたい。

###発生している問題・エラーメッセージ
下記のエラーコードが出てしまい、プログラムが実行できない。

plt.scatter(X[idx] , Y[idx] , **kwargs) TypeError: 'float' object has no attribute '__getitem__'

###該当のソースコード

Python

1 x2 = (round(((pMax1[0] + width1/2)-385)*0.327,2)) 2 y2 = (round(((pMax1[1] + height1/2)-290)*0.327,2)) 3 x3 = (round(((pMax2[0] + width1/2)-385)*0.327,2)) 4 y3 = (round(((pMax2[1] + height1/2)-290)*0.327,2)) 5 l = np.linalg.norm(b-a) 6 l = (round(l,2)) 7 X = (round((50/(l-50))*((x2 + x3)/2),2)) 8 Y = (round((50/(l-50))*((y2 + y3)/2),2)) 9 X1 = [17.80,17.80,18.20,18.00] 10 X2 = [-23.00,-23.30,-23.30,-23.30] 11 X3 = [0.00,0.00,0.00,0.00,0.00,0.00] 12 Y1 = [13.50,10.20,7.10,4.00] 13 Y2 = [14.50,11.20,8.10,5.00] 14 Y3 = [0.00,-7.50,-15.25,-21.10,-27.00,-32.75] 15 16 plt.scatter(X1, Y1, s=800,facecolors="none", marker="o", linewidths="0.1",edgecolors="r") 17 plt.scatter(X2, Y2, s=800,facecolors="none", marker="o", linewidths="0.1",edgecolors="b") 18 plt.scatter(X3, Y3, s=800,facecolors="none", marker="o", linewidths="0.1",edgecolors="g") 19 20 def PENEFAX1(X, Y, rangeX, **kwargs): 21 idx = np.where((X >= rangeX[0]) & (X < rangeX[1])) 22 plt.scatter(X[idx] , Y[idx] , **kwargs) 23 PENEFAX1(X, Y, rangeX=(-30, -10), c='r',marker='o') 24 PENEFAX1(X, Y, rangeX=(-10, 10), c='b', marker='o') 25 PENEFAX1(X, Y, rangeX=(10, 30), c='g', marker='o')

色々なHPや質問サイトを参考に関数を組むことが得策だということで組んでみましたが上手くいきませんでした。

###試したこと

x2,y2,x3,y3,l,X,YはOpenCVのテンプレートマッチングで動画上の座標位置を計算していて、動画の再生と併せて座標位置の計算結果(X,Y)をグラフ上に散布図としてプロットされていました。

X1,X2.X3,Y1,Y2,Y3(こちらも色分けするために無理やり分けています)とX,Yを1つのグラフにプロットしたいです。

###補足情報(言語/FW/ツール等のバージョンなど)
windows10
python2.7
matplotlib
spyder

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

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

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

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

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

guest

回答1

0

ベストアンサー

エラーの原因は、XYの値としてfloat(浮動小数点数)を渡しているのに、

X = (round((50/(l-50))*((x2 + x3)/2),2))
PENEFAX1(X, Y, rangeX=(-30, -10), c='r',marker='o')

メソッド内で配列として参照しようとしている箇所があるためです。

def PENEFAX1(X, Y, rangeX, **kwargs):

idx = np.where((X >= rangeX[0]) & (X < rangeX[1])) plt.scatter(`X[idx]` , `Y[idx]` , **kwargs)

idxの結果によりプロットする、しないを分けたいということであれば、
if文による条件分岐等が必要となるのではないでしょうか。

投稿2017/09/30 03:32

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

Penefax

2017/09/30 04:43

ご回答ありがとうございます。「idxの結果によりプロットする、しないを分けたいということであれば、 if文による条件分岐等が必要となるのではないでしょうか。」という点に関しては特にこだわりはありません。正直、「idx = np.where((X >= rangeX[0]) & (X < rangeX[1]))」の意味がいまいち理解できていません。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問