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

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

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

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

Python

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

Q&A

受付中

3Dベクトルに長さに応じた色を付けたい

smalltrees
smalltrees

総合スコア0

Matplotlib

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

Python

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

1回答

0グッド

0クリップ

236閲覧

投稿2022/11/28 05:05

前提

matplotlib、quiverを用いて3次元座標内でベクトルを描画しています。

実現したいこと

・ベクトルの長さに応じてカラーバーの色を付けたい
・カラーバーも隣に表示したい

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

ValueError: Invalid RGBA argument: 56.8

該当のソースコード

python

1import numpy as np 2import matplotlib.pyplot as plt 3 4##移動前座標 5x1=[595,280,470] 6y1=[415,350,326] 7z1=[286,418,419] 8 9##移動ベクトル 10x2=[9,12,12] 11y2=[3,2,3] 12z2=[56,59,57] 13 14##移動量 15d=(56.8,60.2,58.3) 16 17 18cm=plt.cm.get_cmap('bwr') 19fig=plt.figure() 20 21##軸設定 22ax=fig.add_subplot(1,1,1,projection='3d') 23ax.set_xlabel("x",size=14) 24ax.set_ylabel("y",size=14) 25ax.set_zlabel("z",size=14) 26ax.set_xlim(250,750) 27ax.set_ylim(250,750) 28ax.set_zlim(100,600) 29ax.invert_zaxis() 30 31im=plt.quiver(x1,y1,z1,x2,y2,z2,color=d,cmap=cm) 32fig.colorbar(im,ax=ax,pad=0.2,label="vector length (pixel)") 33im.set_clim(54,61) 34plt.show()

試したこと

・色を指定した3Dベクトルは描画できた
・3D散布図に対してカラーバーから色を付けるのは成功している
・データの最大値・最小値の範囲をカラーバーに設定し、該当データのカラーバー内のRGB値を算出して代入するようなコードを書こうとしたがうまくいかなかった

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

ここにより詳細な情報を記載してください。

以下のような質問にはグッドを送りましょう

  • 質問内容が明確
  • 自分も答えを知りたい
  • 質問者以外のユーザにも役立つ

グッドが多くついた質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

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

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

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

下記のような質問は推奨されていません。

  • 間違っている
  • 質問になっていない投稿
  • スパムや攻撃的な表現を用いた投稿

適切な質問に修正を依頼しましょう。

回答1

0

3Dプロットでは引数Cによるカラーマッピングは用意されていないので、以下のように自力でカラーマップから色リストを作成して指定してやればよいです。

Python

1import numpy as np 2import matplotlib.pyplot as plt 3import matplotlib 4 5##移動前座標 6x1=[595,280,470] 7y1=[415,350,326] 8z1=[286,418,419] 9 10##移動ベクトル 11x2=[9,12,12] 12y2=[3,2,3] 13z2=[56,59,57] 14 15##移動量 16d=(56.8,60.2,58.3) 17 18 19cm=plt.cm.get_cmap('bwr') 20fig=plt.figure() 21 22# 移動量から色(RGBA)リストを作成 23norm = matplotlib.colors.Normalize(vmin=54, vmax=61) # 最小~最大=0~1に正規化 24colors = cm([norm(v) for v in d]) 25 26##軸設定 27ax=fig.add_subplot(1,1,1,projection='3d') 28ax.set_xlabel("x",size=14) 29ax.set_ylabel("y",size=14) 30ax.set_zlabel("z",size=14) 31ax.set_xlim(250,750) 32ax.set_ylim(250,750) 33ax.set_zlim(100,600) 34ax.invert_zaxis() 35 36im=plt.quiver(x1,y1,z1,x2,y2,z2,color=colors) # 色リストを指定する 37fig.colorbar(im,ax=ax,pad=0.2,cmap=cm,label="vector length (pixel)") 38im.set_clim(54,61) 39plt.show()

投稿2022/11/28 06:28

can110

総合スコア36299

良いと思った回答にはグッドを送りましょう。
グッドが多くついた回答ほどページの上位に表示されるので、他の人が素晴らしい回答を見つけやすくなります。

下記のような回答は推奨されていません。

  • 間違っている回答
  • 質問の回答になっていない投稿
  • スパムや攻撃的な表現を用いた投稿

このような回答には修正を依頼しましょう。

回答へのコメント

smalltrees

2022/11/28 09:25

can110様 丁寧な回答ありがとうございます 実行してみましたが、カラースケールの種類の指定ができない点、カラーバーの最大最小値が反映されない点、描画されるベクトルの棒部分と矢印部分で色が異なる点について、何か解決法等はありますでしょうか…? もしお時間ありましたらご確認いただけると幸いです。
can110

2022/11/29 02:38

詳細は調べきれていませんが カラーバーについては、与える元となるcmapオブジェクト自体いろいろカスタマイズできそうなので、それで対応できるかもしれません。 矢印の色が異なる点についてはmatplotlib内部の3Dプロット処理に問題があるような気がします。

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

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

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

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

ただいまの回答率
86.02%

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

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

質問する

関連した質問

同じタグがついた質問を見る

Matplotlib

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

Python

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