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

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

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

Jupyter (旧IPython notebook)は、Notebook形式でドキュメント作成し、プログラムの記述・実行、その実行結果を記録するツールです。メモの作成や保存、共有、確認などもブラウザ上で行うことができます。

Matplotlib

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

Python

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

pandas

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

Q&A

解決済

3回答

839閲覧

二つの変数の前データとの比較による場合分けを4パターン行い、散布図に4色で示したい

taihei_._

総合スコア15

Jupyter

Jupyter (旧IPython notebook)は、Notebook形式でドキュメント作成し、プログラムの記述・実行、その実行結果を記録するツールです。メモの作成や保存、共有、確認などもブラウザ上で行うことができます。

Matplotlib

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

Python

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

pandas

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

0グッド

0クリップ

投稿2021/12/04 12:04

前提・実現したいこと

一つ上の行の値と比較し、それぞれの大小による場合分けを行い、
散布図に示したいです。aが増大でbも増大、aが増大でbが減少、
aが減少でbが増大、aが減少でbが増大というように場合分けをしたいです。

該当のソースコード

import pandas as pd import matplotlib.pyplot as plt list1=[[17,34],[16,22],[12,27],[15,25],[21,26],[23,22]] index1 = ["1", "2", "3","4","5","6"] columns1 =["a", "b"] df=pd.DataFrame(data=list1, index=index1, columns=columns1) df2=df.diff() x1=df['a'] x2=df2['a'] y1=df['b'] y2=df2['b'] def select_color(u,v): if v > 0 & u > 0 : return 'r' elif v < 0 & u >0: return 'b' elif v>0 & u<0 : return 'g' elif v<0 & u<0: return 'y' else: return 'k' plt.scatter(x1,y1,c=[[select_color(u,v) for u in x2 ]for v in y2] ,s=10, alpha=0.4)

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

TypeError: unsupported operand type(s) for &: 'int' and 'float'

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

python3
jupyter notebook

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

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

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

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

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

guest

回答3

0

pandasの機能を使えば、DataFrameだけでグラフを作成することができます。

python

1import pandas as pd 2import matplotlib.pyplot as plt 3 4list1=[[17,34],[16,22],[12,27],[15,25],[21,26],[23,22]] 5index1 = ["1", "2", "3","4","5","6"] 6columns1 =["a", "b"] 7df=pd.DataFrame(data=list1, index=index1, columns=columns1) 8 9df['color'] = 'k' 10df['color'] = df['color'].mask((df['a'].diff() > 0) & (df['b'].diff() > 0), 'r') 11df['color'] = df['color'].mask((df['a'].diff() < 0) & (df['b'].diff() > 0), 'b') 12df['color'] = df['color'].mask((df['a'].diff() > 0) & (df['b'].diff() < 0), 'g') 13df['color'] = df['color'].mask((df['a'].diff() < 0) & (df['b'].diff() < 0), 'y') 14df.plot.scatter(x='a', y='b', c='color', s=100) 15plt.show()

実行結果
scatter

詳しくは、以下をお読み下さい。

pandasで条件に応じて値を代入(where, mask)
pandasのplotメソッドでグラフを作成しデータを可視化

投稿2021/12/04 13:01

ppaul

総合スコア24670

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

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

taihei_._

2021/12/04 14:45

ご回答ありがとうございました。 このような方法もあったのですね。存じ上げていませんでした。 大変ありがとうございました。
guest

0

最初の行が NA になってしまうので 0 で埋めます。

python

1#df2 = df.diff() 2df2 = df.diff().fillna(0)

&(ビット演算子)ではなく and(論理演算子)です。

python

1def select_color(p): 2 u, v = p 3 if v > 0 and u > 0 : 4 return 'r' 5 elif v < 0 and u > 0: 6 return 'b' 7 elif v > 0 and u < 0 : 8 return 'g' 9 elif v < 0 and u < 0: 10 return 'y' 11 else: 12 return 'k'

カラーの指定の仕方がおかしいので修正します。

python

1plt.scatter( 2 x1, y1, s=50, alpha=1.0, 3 c = df2.apply(select_color, axis=1))

scatter

投稿2021/12/04 12:36

melian

総合スコア20655

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

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

taihei_._

2021/12/04 14:45

ご回答ありがとうございました。 NAの修正まで教えていただき、大変ありがとうございます。
guest

0

ベストアンサー

質問者さんの実現したいことは下記のコードで実現できていますでしょうか?

Python

1import pandas as pd 2import matplotlib.pyplot as plt 3 4 5list1=[[17,34],[16,22],[12,27],[15,25],[21,26],[23,22]] 6index1 = ["1", "2", "3","4","5","6"] 7columns1 =["a", "b"] 8df=pd.DataFrame(data=list1, index=index1, columns=columns1) 9df2=df.diff() 10 11x1=df['a'] 12x2=df2['a'] 13y1=df['b'] 14y2=df2['b'] 15 16def select_color(u,v): 17 if v > 0 and u > 0 : 18 return 'r' 19 elif v < 0 and u >0: 20 return 'b' 21 elif v>0 and u<0 : 22 return 'g' 23 elif v<0 and u<0: 24 return 'y' 25 else: 26 return 'k' 27 28plt.scatter(x1,y1,c=[select_color(u,v) for u, v in zip(x2, y2)] ,s=10, alpha=0.4)

イメージ説明

投稿2021/12/04 12:33

meg_

総合スコア10760

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

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

taihei_._

2021/12/04 14:45

ご回答ありがとうございます。 まさにその通りです。 ありがとうございました。 他のお二方のご回答でも実行することができたのですが、 一番早かったご回答ということでベストアンサーとさせていただきます。 大変ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問