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

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

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

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

Python

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

Q&A

1回答

1102閲覧

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

smalltrees

総合スコア0

Matplotlib

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

Python

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

0グッド

0クリップ

投稿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/ツールのバージョンなど)

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

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

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

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

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

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

guest

回答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

総合スコア38262

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

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

smalltrees

2022/11/28 09:25

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

2022/11/29 02:38

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

2023/05/31 06:02

恐らくですが、plt.quiver関数のcolor引数が色を指定する1次のリストのみを受け付けているからうまくいかないのだと思います。つまりRGBAの4つの要素を持つリストを複数与えても機能しないのだと思います。愚直な解決策になりますが、pltでベクトルを一つずつ追記していけば一応は目的は達成されると思います。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

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

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

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問