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

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

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

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

Python

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

Q&A

解決済

1回答

679閲覧

matplotlibによる散布図

Noah_4217

総合スコア9

Matplotlib

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

Python

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

0グッド

0クリップ

投稿2020/01/07 07:20

python matplotlib についての質問です。

添付した写真のようなコードを書きました(以下補足)。

  • df2のカラムであるpitch_typeにはaからfまでの6種類の文字列が違う数入っていて、pitch_type_listはその6つの文字列を重複なくリスト化したものです

  • 同じくdf2のカラムであるpfx_x_cmとpxf_xz_cmには数値が入っています

この時、pitch_typeそれぞれ対応するpfx_x_cmの平均値をx、pfx_z_cmの平均値をyに当てはめた散布図を作りました。さらに、各プロットの大きさをpfx_x_cmとpfx_z_cmの標準偏差にし、色の濃さでそれぞれのpitch_typeの数で表したいと考えました(6種類のpitch_typeのうち数が多いものほど色が濃いなど)。しかし、色の濃さでデータの数を表す方法がわからずググって試行錯誤してみましたが添付ファイルのようなエラーが出てしまします。

解決策がわかる方がいらっしゃいましたら是非ご教授お願いします。

python3

1fig = plt.figure(figsize=(9,9)) 2ax = fig.add_subplot(1,1,1) 3 4for all_pitch_type in pitch_type_list : 5 6 a = df2.query('pitch_type == @all_pitch_type') 7 x = a.pfx_x_cm.mean() 8 y = a.pfx_z_cm.mean() 9 10 size = (a.pfx_x_cm.std() + a.pfx_z_cm.std())/2 * 1500 11 12 cl = a.pitch_type.count() / 10000 13 14 ax.scatter(x, y, s = size, linewidths = 2, c = cl, cmap="Blue") 15 16

イメージ説明

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

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

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

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

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

meg_

2020/01/07 13:18

「cl」の値は何になっていますか?
guest

回答1

0

ベストアンサー

ループにて各データを1つずつプロットするのではなく、配列にデータを入れて全てのデータを纒めて描画すると良いかと思います。

とりあえず、下にダミーのデータを使ったサンプルを記述しましたので参考にしてみてください。

Python

1import pandas as pd 2import numpy as np 3import matplotlib.pyplot as plt 4 5# 仕様に合わせてダミーのデータをランダムで生成 6# -Typeは4種類に減らしてます('A','B','C','D') 7# -値の範囲は適当 8N = 10000 9df2 = pd.DataFrame({ 10 'pitch_type': np.random.choice(['A','B','C','D'], N, 11 p=[0.1, 0.2, 0.3, 0.4]), 12 'pfx_x_cm': np.random.uniform(0,1,N), 13 'pfx_z_cm': np.random.uniform(0,1,N)}) 14print(df2.head()) 15# pitch_type pfx_x_cm pfx_z_cm 16#0 C 0.358624 0.077219 17#1 D 0.857407 0.671054 18#2 D 0.803123 0.580689 19#3 C 0.224072 0.166999 20#4 C 0.090959 0.694175 21 22# グラフに描画するためのデータを構築 23def f(d): 24 return pd.Series(dict( 25 x = d['pfx_x_cm'].mean(), 26 y = d['pfx_z_cm'].mean(), 27 c = ((d['pfx_x_cm'].std() + d['pfx_z_cm'].std()) / 2), 28 s = 2000 * (len(d)/N) # 2000はサイズを調整しているだけの値です 29 )) 30 31plot_df = df2.groupby('pitch_type').apply(f) 32print(plot_df) 33# x y c s 34#pitch_type 35#A 0.498983 0.482088 0.287733 207.6 36#B 0.488862 0.517812 0.287330 402.8 37#C 0.501381 0.504441 0.290224 588.8 38#D 0.499880 0.504987 0.289771 800.8 39 40# グラフを描画 41fig = plt.figure(figsize=(9,9)) 42ax = fig.add_subplot(1,1,1) 43 44c = ax.scatter(x=plot_df.x, y=plot_df.y, 45 c=plot_df.c, s=plot_df.s, 46 linewidths=2, cmap='Blues') 47 48# 一応 pitch_type も描画しておく(こちらはループを使う必要あり) 49for idx, row in plot_df.iterrows(): 50 ax.text(x=row.x, y=row.y, s=idx, c='r', 51 horizontalalignment='center', 52 verticalalignment='center') 53# Colorbarを描画 54fig.colorbar(c, ax=ax) 55 56plt.show()

イメージ説明

あまりデータが良くないかも・・・

投稿2020/01/08 02:34

magichan

総合スコア15898

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問