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

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

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

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

Python

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

Q&A

解決済

1回答

2543閲覧

matplotlibの値が0の点の非表示

simasimaa

総合スコア41

Matplotlib

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

Python

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

0グッド

2クリップ

投稿2017/10/10 22:51

python

1from mpl_toolkits.mplot3d import Axes3D 2import matplotlib.pyplot as plt 3import numpy as np 4 5data=np.zeros((25,25,25)) 6data[24][0][0]=30 7X,Y,Z = np.meshgrid(range(data.shape[0]), range(data.shape[1]), range(data.shape[2])) 8 9fig = plt.figure() 10ax = fig.add_subplot(111, projection='3d', aspect='equal') 11sc = ax.scatter(X, Y, Z, vmin=-30,vmax=30,c=data, alpha=0.3, cmap='seismic') 12fig.colorbar(sc) 13plt.show()

dataは現在x、y、zの3軸とその値とあわせて4軸持っており、一点以外は値が0です。私が解きたい問題では値を持っている点は徐々に増えていき、それを3Dで可視化しようと思うのですが、0の点の数が多すぎて実行結果のように黒くなってしまいます。値を持っている点が増えていく様子を描写したいのですが、値0の点のみ描写しない方法、または点のふちをなくすことを考えています。どのように書けばいいでしょうか。よろしくお願いします。イメージ説明説明](98ec37484e86fee4bebe0ac8cebb9a0c.png)

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

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

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

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

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

guest

回答1

0

ベストアンサー

まず、marker のエッジ色ですが、ax.scatter() の引数で edgecolor=None または edgecolor='fase' で facecolor と同色になるかと思います。

次に、値0の点のみ描写しない方法ですが、データ自体を編集する方法もありますが、colormap を修正する方法が比較的簡単なのでこちらを説明します。

現在colormap seismic を使用しているようですので、まずはこれを

Python

1import matplotlib.pyplot as plt 2 3cm = plt.cm.seismic 4cm_list = cm(np.arange(cm.N)) 5print(cm_list)

とすると、cm.N 諧調(256階調になっているはず)で seismic のデータ配列を得ることができます。
この配列の4列目がalpha値(透明度)なので

Python

1# 全体の透明度を0.3に設定 2cm_list[:, -1] = 0.3 3# 中心部(127,128行目) の透明度を 0 に設定 4cm_list[[127,128], -1] = 0.

などと書き換えて、最後に

from matplotlib.colors import ListedColormap mycmap = ListedColormap(cm_list)

とするとカスタム版の seismic が作成できます。
あとはこれを ax.scatter() にて

Python

1sc = ax.scatter(X, Y, Z, vmin=-30,vmax=30, c=data, cmap=mycmap)

cmapに設定すると、0 付近の値が表示されていない(透明色で表示されている)はずです。

ax.scatter()の引数で alpha=0.3 を設定してしまうと、その値

が優先される為、colormap で設定した alpha値が 無視されるので注意してください。

今回は説明の簡略化の為に、中心のみ alpha値を 0 に書き換えましたが、0に近づく毎に aplpa値を段階的に下げていくなどの処理があったほうがよいかもしれません。

最後に、一応動くコードを置いておきます。

Python

1from mpl_toolkits.mplot3d import Axes3D 2import matplotlib.pyplot as plt 3from matplotlib.colors import ListedColormap 4import numpy as np 5 6# data生成 7data=np.zeros((25,25,25)) 8data[24][0][0]=30 9data[24][0][0]=30 10c = np.zeros((25,25,25)) 11X,Y,Z = np.meshgrid(range(data.shape[0]), range(data.shape[1]), range(data.shape[2])) 12 13# colormap生成 14cm = plt.cm.seismic 15cm_list = cm(np.arange(cm.N)) 16cm_list[:, -1] = 0.3 17cm_list[[127,128], -1] = 0 18mycmap = ListedColormap(cm_list) 19 20# 描写処理 21fig = plt.figure() 22ax = fig.add_subplot(111, projection='3d', aspect='equal') 23sc = ax.scatter(X, Y, Z, vmin=-30,vmax=30,c=data, cmap=mycmap, edgecolor=None) 24fig.colorbar(sc) 25plt.show()

投稿2017/10/11 00:28

magichan

総合スコア15898

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

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

simasimaa

2017/10/11 08:50

本当にありがとうございます。????
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問