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

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

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

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

Python

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

Q&A

1回答

4834閲覧

Matplotlibで3D Dataを2D color mapとしてプロットしたい

yuki0000

総合スコア12

Matplotlib

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

Python

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

0グッド

5クリップ

投稿2018/08/11 16:13

X = [x1,x2,•••,xn]
Y = [y1,y2,•••,yn]
のような2次元座標と、その座標でのあるパラメータ
Z = [z1,z2,•••,zn]
のような、3次元データがあります。
このZはX,Yの関数としては書けません。
順番のみで関係し、(xn,yn)の時の値がznという具合です。

このようなデータがあって、横軸X、縦軸Yとして、Zの値の平面分布を下図のように値の大小によって異なる色を滑らかにプロットするにはどうすればいいでしょうか。
イメージ説明
(https://www.earthdatascience.org/tutorials/visualize-digital-elevation-model-contours-matplotlib/ から引用)

調べると大体は
X,Y = numpy.meshgrid(X,Y)
Z = numpy.sin(X) + numpy.cos(Y)
のようにZがX,Yの関数として書いた場合のcontourとしての結果が出てきます。
しかし、前述のようにZはX,Yの関数として書くことはできません。

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

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

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

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

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

tachikoma

2018/08/11 16:27

格子点ではなく、規則性を持たないN個のサンプル点から滑らかなcolormapを作りたいということですか?
yuki0000

2018/08/11 16:33

はい、そうなります。ただ、元のデータがそういうデータなだけで、少し面倒な工夫してでもそのような図を作れれば良いです。
guest

回答1

0

試せてないので情報ですが、補完が必要です。下記を参考にしてみて下さい。

Interpolation (scipy.interpolate)


上記のコードを少しだけ編集したものを置いておきます。補完アルゴリズムやパラメータは適宜調整する必要があると思います。

Python

1import numpy as np 2import matplotlib.pyplot as plt 3 4# 2-d tests - setup scattered data 5x = np.random.rand(100)*4.0-2.0 6y = np.random.rand(100)*4.0-2.0 7z = x*np.exp(-x**2-y**2) 8plt.scatter(x, y, c=z) 9plt.colorbar() 10plt.show()

scatter

python

1# Interpolation: use RBF 2from scipy.interpolate import Rbf 3 4ti = np.linspace(-2.0, 2.0, 100) 5XI, YI = np.meshgrid(ti, ti) 6rbf = Rbf(x, y, z, epsilon=2) 7ZI = rbf(XI, YI) 8 9# plot the result 10plt.subplot(1, 1, 1) 11plt.pcolor(XI, YI, ZI) 12plt.scatter(x, y, 100, z) 13plt.title('RBF interpolation - multiquadrics') 14plt.xlim(-2, 2) 15plt.ylim(-2, 2) 16plt.colorbar() 17plt.show()

result

投稿2018/08/12 02:18

編集2018/08/12 07:51
tachikoma

総合スコア3601

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

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

yuki0000

2018/08/12 07:16

ありがとうございます。ただ一通り見てもやはりzがx,yで記述される場合のみのような気がするのですが、そうでない説明の箇所があればその箇所を教えていただけますでしょうか。文字検索をするので、数語だけコピペしていただくだけで結構です。
tachikoma

2018/08/12 07:52

失礼、リンクが間違ってました(修正済み)
tachikoma

2018/08/12 07:54

上記のコードではzを数式で計算していますが、それは必須条件ではないことに注意して下さい。scatterがかければ十分です。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問