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

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

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

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

Python

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

pandas

Pandasは、PythonでRにおけるデータフレームに似た型を持たせることができるライブラリです。 行列計算の負担が大幅に軽減されるため、Rで行っていた集計作業をPythonでも比較的簡単に行えます。 データ構造を変更したりデータ分析したりするときにも便利です。

Q&A

解決済

1回答

4701閲覧

3D散布図でサンプルのグループ番号ごとにグラデーションで色分け

teruque

総合スコア6

Matplotlib

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

Python

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

pandas

Pandasは、PythonでRにおけるデータフレームに似た型を持たせることができるライブラリです。 行列計算の負担が大幅に軽減されるため、Rで行っていた集計作業をPythonでも比較的簡単に行えます。 データ構造を変更したりデータ分析したりするときにも便利です。

0グッド

0クリップ

投稿2020/03/15 07:34

編集2020/03/16 00:42

###前提・実現したいこと
3D散布図でサンプルのグループ番号ごとにグラデーションで色分けをしたいです。
hsvなどのカラーマップを試してみたりしたのですが、コードが上手く書けず何をしてもエラーになってしまいます。
宜しくお願い致します。

###Data
PC1,PC2,PC3,sample
-0.1413928,0.02173982,-4.15E-01,1
-0.1413101,0.017508996,-4.21E-01,1
-0.1417087,0.014979086,-4.08E-01,1
-0.1411702,0.008670829,-4.09E-01,1
-0.145876,0.123370613,-1.03E-01,2
-0.1433736,0.124895934,-1.41E-01,2
-0.1456516,0.092020696,-1.09E-01,3
-0.1461915,0.094471875,-1.18E-01,3
-0.1461108,0.090837929,-1.21E-01,3
-0.1472447,0.119571378,-4.57E-02,4
-0.1472894,0.115520249,-4.68E-02,4
-0.1467504,0.121762527,-4.68E-02,4
-0.1491286,0.090455109,9.15E-02,5
-0.1487338,0.09812073,9.12E-02,5
-0.1489169,0.072974728,1.14E-01,6
-0.1490467,0.085162278,1.12E-01,6
-0.1489641,0.08360632,1.23E-01,7
-0.148754,0.088689326,1.12E-01,7
-0.1487234,0.090154785,1.12E-01,7
-0.1490534,0.096598206,9.36E-02,8
-0.149099,0.096547726,8.85E-02,8
-0.1491893,0.096628792,1.14E-01,9
-0.1490337,0.10319152,1.07E-01,9
-0.1490627,0.102746721,1.06E-01,9
-0.1479182,0.114529747,1.13E-01,10
-0.1483447,0.106218026,1.26E-01,10
-0.1483964,0.106148189,1.23E-01,11
-0.1482859,0.103531061,1.23E-01,11
-0.1487256,0.110975705,9.76E-02,12
-0.1481255,0.126683827,9.22E-02,12
-0.1479033,0.130060792,8.73E-02,12
-0.1359165,0.061005493,-7.12E-02,13
-0.1372293,0.073245259,-4.54E-02,13
-0.1464516,-0.153001981,2.27E-03,14
-0.1449456,-0.204644258,9.43E-03,14
-0.1474867,-0.111179279,-4.29E-05,15
-0.1463186,-0.170116339,1.78E-02,15
-0.1458789,-0.176175751,2.37E-02,15
-0.142477,-0.255583393,3.95E-02,16
-0.143537,-0.25325231,3.06E-02,16
-0.1428187,-0.278201657,2.85E-02,16
-0.1427046,-0.253661164,3.15E-02,17
-0.1432171,-0.270822563,2.90E-02,17
-0.1431351,-0.272426721,2.78E-02,17
-0.1442404,-0.212473411,5.68E-02,18
-0.1442105,-0.220104095,4.73E-02,18
-0.1439502,-0.216082524,3.67E-02,18

##グラデーションになっていないがグラフはできるソースコード

python

1import pandas as pd 2import matplotlib.pyplot as plt 3from mpl_toolkits.mplot3d import Axes3D 4import matplotlib.colors as mcolors 5 6df = pd.read_csv(r"test.csv", delimiter=",", sep='\s+', skipinitialspace=True) 7 8fig = plt.figure() 9ax = Axes3D(fig) 10 11samples = sorted(set(df['sample'])) 12colors = list(mcolors.CSS4_COLORS.keys()) 13 14# sample毎に描画 15for idx, sample in enumerate(samples): 16 df2 = df[df['sample'] == sample] 17 X = df2["PC1"] 18 Y = df2["PC2"] 19 Z = df2["PC3"] 20 p=ax.scatter(X, Y, Z, c=colors[idx], label=sample) 21 22plt.legend() 23plt.show()

##グラデーションにしようとしてエラーが出るソースコード

Python

1import pandas as pd 2import matplotlib.pyplot as plt 3from mpl_toolkits.mplot3d import Axes3D 4import matplotlib.colors as mcolors 5 6df = pd.read_csv(r"test.csv", delimiter=",", sep='\s+', skipinitialspace=True) 7 8fig = plt.figure() 9ax = Axes3D(fig) 10 11samples = sorted(set(df['sample'])) 12cmapval = df['sample'] 13 14 15# sample毎に描画 16for idx, sample in enumerate(samples): 17 df2 = df[df['sample'] == sample] 18 X = df2["PC1"] 19 Y = df2["PC2"] 20 Z = df2["PC3"] 21 p=ax.scatter(X, Y, Z, c=cmapval, cmap='hsv', label=sample) 22 23plt.legend() 24plt.show() 25

##補足情報(FW/ツールのバージョンなど)
python 3.7
seaborn 0.10.0
pandas 1.0.1
matplotlib 3.2.0

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

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

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

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

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

meg_

2020/03/15 10:11

インデントが分からないので、コードは「コードの挿入」で記入しましょう。
meg_

2020/03/15 10:12

エラーが起きているなら、エラーコードを追記してください。
teruque

2020/03/15 14:12

コメントありがとうございます。 すみません、「コードの挿入」で記入しました。
teruque

2020/03/16 00:49

遅くなりましたが、yureighostさんへの回答に記載したのと同じく、エラーが出るコードを追記しました。 下記のエラーが出てしまいます。 raise ValueError(f"Invalid RGBA argument: {orig_c!r}") ValueError: Invalid RGBA argument: 1.0 During handling of the above exception, another exception occurred: ---<ファイルパス等あるので割愛させてください>--- raise invalid_shape_exception(c.size, xsize) ValueError: 'c' argument has 47 elements, which is inconsistent with 'x' and 'y' with size 4. >>> plt.legend() No handles with labels found to put in legend. <matplotlib.legend.Legend object at 0x000001DEB4454CF8>
guest

回答1

0

ベストアンサー

質問者の環境と同じに再現できてるかはわからないですが、
Dataの部分が貼り付けてある通り半角スペース区切りのデータなら
read_csv関数で区切れずに半角スペースの含まれた文字のまま一つのカラムで読み込まれてしまっています。
カンマ区切りのdelimiterは不要でsepのみで大丈夫です。
それでエラーは発生せずにグラフの描画が行われます。

python

1df = pd.read_csv(r"ファイルパス", sep='\s+', skipinitialspace=True)

追記
質問で挙げられている「グラデーションになっていないがグラフはできるソースコード」で
グループ毎の色分け自体はできていると思います。
ただ白っぽい色が入っているためグラフ上で見えにくくなってしまっているだけで。
白い色の入っていないカラーテーブルを使う方法はどうでしょうか。

python

1import pandas as pd 2import matplotlib.pyplot as plt 3from mpl_toolkits.mplot3d import Axes3D 4import matplotlib.cm as cm 5 6df = pd.read_csv(r"test.csv", delimiter=",", sep='\s+', skipinitialspace=True) 7 8fig = plt.figure() 9ax = Axes3D(fig) 10 11samples = sorted(set(df['sample'])) 12dsize = len(samples) 13 14# sample毎に描画 15for idx, sample in enumerate(samples): 16 df2 = df[df['sample'] == sample] 17 X = df2["PC1"] 18 Y = df2["PC2"] 19 Z = df2["PC3"] 20 p=ax.scatter(X, Y, Z, c=[cm.hsv(idx/dsize)], label=sample) 21 22plt.legend() 23plt.show()

投稿2020/03/15 10:49

編集2020/03/17 07:44
yureighost

総合スコア2183

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

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

teruque

2020/03/15 14:12

ご指摘ありがとうございます。 エクセルで開いたCSVから張り付けてしまったのでカンマがなくなりましたが、実際はカンマ区切りデータです。修正しました。
yureighost

2020/03/15 16:25

修正された内容だとエラーにならずグラフが書き出されますね。 どういうエラーが出力されているのか知りたいところです。
teruque

2020/03/16 00:47

レスありがとうございます。 グラデーションを試してみたコードを追記しました。 下記のエラーが出てしまいます。 raise ValueError(f"Invalid RGBA argument: {orig_c!r}") ValueError: Invalid RGBA argument: 1.0 During handling of the above exception, another exception occurred: ---<ファイルパス等あるので割愛させてください>--- raise invalid_shape_exception(c.size, xsize) ValueError: 'c' argument has 47 elements, which is inconsistent with 'x' and 'y' with size 4. >>> plt.legend() No handles with labels found to put in legend. <matplotlib.legend.Legend object at 0x000001DEB4454CF8>
yureighost

2020/03/16 01:31

エラー自体はfor文でsampleの値で18グループに分割して描画している処理の中で、 4のサイズしかない1つ目のグループで 47サイズあるsampleの配列をカラーに指定しようとしているからですね。 なのでカラーの配列を4つまでに絞ればエラーは消えるはずです。
teruque

2020/03/17 06:44

なるほど、そういうエラーなんですね。 18グループあるサンプルでグループごとに色分け(18段階のグラデーションで、グループ内は同じ色)をしたいのですが、今回用いているグループごとに描画するコードだとそれが難しいのかもしれないと理解しました。 もう少し自分で調べてみたいとは思いますが、もし解決策ございましたらご教示頂ければありがたいです。 ありがとうございました。
teruque

2020/03/17 13:04

サンプル数を定義して、そのサンプル数でhsvのカラー諧調数を規定するという感じなんですね。これぞ私がやりたかったことです! カラーマップの使い方が理解でき、とても勉強になりました。 ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問