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

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

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

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

NumPy

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

Python

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

Q&A

解決済

1回答

6513閲覧

Pythonのmatplotlibを使って三次元散布図をシンプルに描写したい

ShikaTech

総合スコア468

Matplotlib

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

NumPy

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

Python

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

1グッド

2クリップ

投稿2017/07/24 06:04

編集2017/07/24 06:08

###前提・実現したいこと
Python初心者です。
1人3属性からなる1000件ほどのデータを、3次元の散布図として描写したいです。
属性一つ一つがそのままX,Y,Zに対応するイメージです。
さらにZ軸の高低により色付けも行ない、グラデーション状のカラーマップも描写したいです。

例)

  • X軸=属性1=年齢/20~89の範囲
  • Y軸=属性2=週に何度運動をするか/0~7の範囲
  • Z軸=属性3=体重/30~150の範囲

これ↑で描写を行なって体重が軽ければ寒色・重ければ暖色のグラデーションを付ける。
体重が重い人が多く位置するデータから属性の傾向を見極めたいというのが最終的にやりたいことです。

###試したこと
まずmatplotlibで3Dグラフを描画するを参考に描写ロジックを書きました。
が、Z軸に相当するデータをどのように作ればよいかが分かりません。
X軸Y軸は元データがあるため、生データの配列を直接指定し、サンプルコードの通りmeshgridと通して生成しています。
Z軸にも生の配列をどうにかしてセットしたいところですが、meshgridを通したX,Yに対してどのように与えるべきかが分からず。。

次にSciPy+matplotlibで3D散布図を作成(Python)を参考に別のアプローチで書いてみました。
X,Y,Zに相当するCSVを手動で作成し、それを元データとして読み込み、単純な描写としては概ね意図通りの表示ができました。
ただこれにカラーマップを追加する方法が分からず、色も手動で指定していたためグラデーションにできていません。
※例えば元データZのパーセンタイル10で分割してグラデーションした10色を宣言して一つ一つ色を変えて…等やればできるのだと思いますが、もっとシンプルかつ簡単にできないものか?と思っています。

cmap=plt.cm.bwrこんな感じで書けないのかなー?っていう。

Python

1from mpl_toolkits.mplot3d import Axes3D 2import matplotlib.pyplot as plt 3import matplotlib.cm as cm 4 5fig = plt.figure(figsize=(10, 5)) 6ax = fig.add_subplot(111, projection='3d') 7p = ax.scatter3D(X, Y, Z, s=3, c=Z, cmap=plt.cm.bwr) 8fig.colorbar(p)

###補足情報(言語/FW/ツール等のバージョンなど)
Windows 10 64
Python 3.6.1
numpy.version.version 1.13.1
matplotlib.version 2.0.2

###最後に
そもそも勘違いしている、意図したことをもっと簡単にできるよ!この情報が足りてない、、等々ありましたらご指摘ください。
メインC#歴10年で、Pythonは今回必要に迫られて初めて触ります。
元データの整形や縦横変換、トリミングなどの元データ編集は自在にできると思っていただいてOKです。

退会済みユーザー👍を押しています

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

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

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

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

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

guest

回答1

0

ベストアンサー

提示コードとだいたい同じですが、以下でいかがでしょうか?

Python

1from matplotlib import pyplot as plt 2import numpy as np 3from mpl_toolkits.mplot3d.axes3d import Axes3D 4 5x = np.array([20,40,50,80]) # 年齢 6y = np.array([0,1,3,7]) # 運動 7z = np.array([30,50,70,120])# 体重 8 9fig = plt.figure() 10ax = Axes3D(fig) 11p = ax.scatter(x, y, z, c=z, cmap='hot') # zにカラーマップを利用 12fig.colorbar(p) 13plt.show()

イメージ説明

投稿2017/07/24 06:34

can110

総合スコア38256

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

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

ShikaTech

2017/07/24 06:42

ありがとうございました。 ものすごく単純な話で、meshgridを抜いてそのまま配列を使ってやればよかったんですね。。 思いつきませんでした。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問