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

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

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

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

Q&A

解決済

1回答

301閲覧

plt.contourの線の色の変更の仕方

yyicp

総合スコア70

Python

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

1グッド

0クリップ

投稿2024/04/15 06:18

編集2024/04/15 07:31

実現したいこと

「該当のソースコード」はこのページを元にしたものですが、私の質問内容の具体例として挙げただけで、深い意味はありません。6、7行目のデータはこちらのCase BのCase 5: low particle density and small particleです。

「該当のソースコード」を実行すると、以下の図が出てきます。(test1.png)
イメージ説明

ここで、等高線を描きたい量(displacement)は整数値しかとらないことに気づいたため、等高線をcontourfからcontourに変更しようと思いました。(48行目のcontourf→contour)
その実行結果が以下の図です。(test2.png)
イメージ説明

test2.pngの色が少し見づらいので、それを設定する方法を教えてください。
test1.pngは4色、test2.pngは5色必要なので、そもそもtest1.pngから自分で1色増やさなければいけません。

例えば、test2.pngの色を、上から順に紫、赤、黄、緑、青と設定したいです。

該当のソースコード

python

1import matplotlib.pyplot as plt 2import numpy as np 3from skimage.io import imread 4from scipy.signal import correlate 5 6path1 = r'.\B005_1.tif' 7path2 = r'.\B005_2.tif' 8 9a = imread(path1) 10b = imread(path2) 11 12win_size = 32 13 14def vel_field(curr_frame, next_frame, win_size): 15 ys = np.arange(0, curr_frame.shape[0], win_size) 16 xs = np.arange(0, curr_frame.shape[1], win_size) 17 dys = np.zeros((len(ys), len(xs))) 18 dxs = np.zeros((len(ys), len(xs))) 19 20 for iy, y in enumerate(ys): 21 for ix, x in enumerate(xs): 22 int_win = curr_frame[y : y + win_size, x : x + win_size] 23 search_win = next_frame[y : y + win_size, x : x + win_size] 24 cross_corr = correlate( 25 search_win - search_win.mean(), int_win - int_win.mean(), method="fft" 26 ) 27 dys[iy, ix], dxs[iy, ix] = ( 28 np.unravel_index(np.argmax(cross_corr), cross_corr.shape) 29 - np.array([win_size, win_size]) 30 + 1 31 ) 32 33 # draw velocity vectors from the center of each window 34 ys = ys + win_size / 2 35 xs = xs + win_size / 2 36 37 return xs, ys, dxs, dys 38 39xs, ys, dxs, dys = vel_field(a, b, win_size) 40 41x = xs 42y = ys[::-1] 43x, y = np.meshgrid(x, y) 44z = dys 45 46levels1 = np.linspace(-10,10,5) 47levels2= np.linspace(-10,10,5) 48ax2 = plt.contourf(x,y,z,cmap='jet',levels=levels2) 49ax2.set_clim(vmin=min(levels2), vmax=max(levels2)) 50cb = plt.colorbar(ticks=levels1) 51cb.set_label("y-direction displacement[pixel]", fontsize=16) 52cb.ax.tick_params(labelsize=12) 53plt.xlabel("x[pixel]", fontsize=12) 54plt.ylabel("y[pixel]", fontsize=12) 55plt.xticks(fontsize=12) 56plt.yticks(fontsize=12) 57plt.savefig('test1.png')

試したこと

ネットで色々調べましたが、よく分かりませんでした。

「該当のソースコード」の48行目を
ax2 = plt.contour(x,y,z,cmap='jet',levels=levels2,colors=['purple', 'r', 'y', 'g', 'b'])
としてみましたが、下記のようなエラーメッセージが出てしまいました。

Traceback (most recent call last): File "・・・\testCV228-2.py", line 69, in <module> ax2 = plt.contour(x,y,z,cmap='jet',levels=levels2,colors=['purple', 'r', 'y', 'g', 'b']) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "・・・\Python311\Lib\site-packages\matplotlib\pyplot.py", line 2527, in contour __ret = gca().contour( ^^^^^^^^^^^^^^ File "・・・\Python311\Lib\site-packages\matplotlib\__init__.py", line 1461, in inner return func(ax, *map(sanitize_sequence, args), **kwargs) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "・・・\Python311\Lib\site-packages\matplotlib\axes\_axes.py", line 6449, in contour contours = mcontour.QuadContourSet(self, *args, **kwargs) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "・・・\Python311\Lib\site-packages\matplotlib\contour.py", line 756, in __init__ raise ValueError('Either colors or cmap must be None') ValueError: Either colors or cmap must be None
melian👍を押しています

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

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

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

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

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

can110

2024/04/15 07:09

https://teratail.com/help/question-tips は読みましたか? 読んだ結果を本文に反映ください。解決のヒントを探れるかもしれません。 「調べましたが、よく分かりません」の内容が分からないので 「~は調べましたか?」→「それはすでに調べましたが分かりませんでした」 といった無駄なやり取りが発生する可能性があります。
yyicp

2024/04/15 07:33 編集

>can110様 コメントありがとうございます。 「試したこと」を加筆しましたのでご確認ください。
melian

2024/04/15 08:52

> Either colors or cmap must be None と表示されているので、colors だけ指定してみてはどうでしょうか。 ax2 = plt.contour(x,y,z,levels=levels2,colors=['purple', 'r', 'y', 'g', 'b'])
yyicp

2024/04/16 01:03 編集

>melian様 できました。 ありがとうございました。 ベストアンサーに選びたいので、解答欄に記入していただきますようお願いします。 (図の添付は不要です) なお、その際はcolorsの中の色の順番を逆にしてください。(私のミスです。申し訳ありません) ax2 = plt.contour(x,y,z,levels=levels2,colors=['b', 'g', 'y', 'r', 'purple'])
can110

2024/04/16 00:49

解決おめでとうございます! 解決方法をまとめて、「自己解決」として回答してください! 同じように困っている人の貴重な情報になると思います。
yyicp

2024/04/16 01:01

>can110様 ありがとうございます。 melian様に回答欄に記入するようお願いしました。
guest

回答1

0

ベストアンサー

※ コメントから転記

Either colors or cmap must be None

と表示されていますので、colors だけ指定するとよいかと思います。

python

1ax2 = plt.contour(x,y,z,levels=levels2,colors=['b', 'g', 'y', 'r', 'purple'])

投稿2024/04/16 01:38

melian

総合スコア21190

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

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

yyicp

2024/04/16 02:27

できました。 どうもありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.30%

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

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

質問する

関連した質問