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

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

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

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

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Q&A

解決済

2回答

316閲覧

【python】Dataframe

cheriraoka

総合スコア42

Matplotlib

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

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

0グッド

0クリップ

投稿2022/07/15 06:40

実現したいこと

いつも大変お世話になっております。
下図のデータフレームの斤量と上りの散布図をcourse_lenごとにプロットしたいと考えています。1つの散布図に全てをプロットするのではなく、course_lenの数の分だけ表示させたいです。
イメージ説明

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

下のコードのようにplt.subplotで散布図をcourse_lenの分、用意することはできましたが、全てのデータが全ての散布図に入ってしまいます(コード下の画像参照)。

values = list(df['course_len'].unique()) fig = plt.figure(figsize=(10,20)) for i in range(len(values)): plt.subplot(len(values), 1, i+1) plt.title('course_len ' + str(values[i])) for value in values: x = df[df['course_len'] == value]['斤量'] y = df[df['course_len'] == value]['上り'] plt.scatter(df[df['course_len'] == value]['斤量'], df[df['course_len'] == value]['上り'])

イメージ説明

これをcourse_lenごとに散布したいと考えています。ご教示のほどよろしくお願いいたします。

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

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

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

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

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

guest

回答2

0

groupby を使ってみてもよいかもしれません。

python

1import pandas as pd 2import numpy as np 3from matplotlib import pyplot as plt 4 5N = 14 6df = pd.DataFrame({ 7 'course_len': np.linspace(10, 36, N).repeat(N), 8 '斤量': np.random.randint(0, 26, N*N) * 0.5 + 47.0, 9 '上り': np.random.uniform(32, 38, N*N), 10}) 11 12# 13axes = plt.subplots(N, 1, figsize=(10, 20))[1].flatten() 14for (c, g), ax in zip(df.groupby('course_len'), axes): 15 g.plot.scatter(x='斤量', y='上り', ax=ax, title=f'course_len {c}') 16 17plt.setp(axes, xlim=[46, 60], ylim=[32, 38], xlabel='', ylabel='') 18plt.tight_layout() 19plt.show()

イメージ説明

投稿2022/07/16 00:06

melian

総合スコア19805

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

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

cheriraoka

2022/07/16 02:40

回答ありがとうございます。setp関数は初見でした。勉強させていただきます。
guest

0

ベストアンサー

とりあえず以下のようにdf['course_len'] == values[i]という条件で抽出すべきで、二重にループする必要はありません。
なお、各グラフのX,Y範囲は全体が収まるような共通の値をセットすると、比較してみたい場合に分かりやすいかもです。

Python

1import pandas as pd 2from io import StringIO 3import matplotlib.pyplot as plt 4 5s = """course_len,斤量,上り 610.0,48.0,33.40 710.0,48.5,35.90 836.0,54.0,36.25 936.0,56.0,36.00 1036.0,57.0,35.50""" 11df = pd.read_csv(StringIO(s)) 12 13values = list(df['course_len'].unique()) 14 15fig = plt.figure(figsize=(10,20)) 16 17for i in range(len(values)): 18 plt.subplot(len(values), 1, i+1) 19 plt.title('course_len ' + str(values[i])) 20 x = df[df['course_len'] == values[i]]['斤量'] 21 y = df[df['course_len'] == values[i]]['上り'] 22 plt.scatter(x, y) 23 24plt.show()

投稿2022/07/15 07:44

can110

総合スコア38266

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

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

cheriraoka

2022/07/16 02:39

回答ありがとうございます。valuesの要素を取り出せば良かったのですね。また、グラフの範囲についてもアドバイスありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問