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

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

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

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

Python

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

Q&A

解決済

1回答

590閲覧

Pythonにて文字列の要素を含む3次元の散布図グラフを作成したい

fumiojisan

総合スコア26

Matplotlib

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

Python

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

0グッド

1クリップ

投稿2023/01/05 10:52

前提

Pythonを用いて、3次元の散布図グラフを作成しようとしています。
そのうち2軸はstring型の単語を用い、1軸は離散的な値を用いたいと考えています。
matplotlibにて散布図のグラフを出そうとする際に以下のエラーメッセージが発生しました。
ValueError: could not convert string to float:

実現したいこと

・文字列を含むデータを3次元の散布図グラフに表したい。
・特に、3次元のグラフを3D plotを用いて、動かしたい
・データは以下のような形式
イメージ説明

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

python

1ValueError: could not convert string to float:

該当のソースコード

python

1from mpl_toolkits.mplot3d import Axes3D 2import matplotlib.pyplot as plt 3import pandas as pd 4x = df["要素1"] 5y = df["要素2"] 6z = df["要素3"] 7 8fig = plt.figure() 9ax = fig.add_subplot(projection='3d') 10ax.set_xlabel('要素1', fontsize =12) 11ax.set_ylabel('要素2', fontsize =12) 12ax.set_zlabel('要素3', fontsize =12) 13ax.scatter(x, y, z, c=z, cmap="plasma_r", s=50, alpha=1) 14 15plt.show()

試したこと

・2次元であれば、文字列のデータを含む散布図を作成することができています。

python

1from mpl_toolkits.mplot3d import Axes3D 2import matplotlib.pyplot as plt 3import pandas as pd 4x = df["要素1"] 5y = df["要素2"] 6 7fig = plt.figure() 8ax = fig.add_subplot(111) 9ax.set_xlabel('要素1', fontsize =12) 10ax.set_ylabel('要素2', fontsize =12) 11ax.scatter(x, y, c=z, cmap="plasma_r", alpha=0.75) 12 13plt.show()

イメージ説明

・一度、全ての軸をstring型でない数値型で入力した後に、
set_xticklabels, set_yticklabelsで変換しましたが、値は要素3のため、上手く表現できず。

python

1fig = plt.figure() 2ax = fig.add_subplot(projection='3d') 3ax.set_xlabel('要素1', fontsize =12) 4ax.set_ylabel('要素2', fontsize =12) 5ax.set_zlabel('要素3', fontsize =12) 6ax.scatter(z, z, z, c=z, cmap="plasma_r", s=50, alpha=1) 7 8ax.set_xticklabels(x, fontsize =6) 9ax.set_yticklabels(y, fontsize =6) 10 11plt.show()

イメージ説明

すみませんが、3次元で文字列の要素を含むグラフの表し方を教えて頂けないでしょうか。

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

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

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

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

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

yuma.inaura

2023/01/06 00:55

省略せずそのまま実行・再現できるスクリプトを載せていただくと回答しやすくなりそうです
yuma.inaura

2023/01/06 01:07

文字列を軸にして散布図にするってどういうことなんでしょうか?
guest

回答1

0

ベストアンサー

以下のような感じで文字列をcategory型に変換します。
あとは座標値は数値で、目盛りは文字列で与えるとよいかと思います。

Python

1from mpl_toolkits.mplot3d import Axes3D 2import matplotlib.pyplot as plt 3import pandas as pd 4from io import StringIO 5 6# テストデータ 7s = """e1,e2,e3 8A,a,1 9B,c,2 10C,b,3 11A,a,4 12B,a,5 13C,d,3 14D,d,3""" 15df = pd.read_csv(StringIO(s)) 16 17x = df['e1'].astype('category') 18y = df['e2'].astype('category') 19 20# 数値 21xv = x.cat.codes 22yv = y.cat.codes 23# ラベル 24xl = x.cat.categories 25yl = y.cat.categories 26 27z = df['e3'] 28 29fig = plt.figure() 30ax = fig.add_subplot(projection='3d') 31ax.set_xlabel('e1', fontsize =12) 32ax.set_ylabel('e2', fontsize =12) 33ax.set_zlabel('e3', fontsize =12) 34ax.scatter(xv, yv, z, c=z, cmap="plasma_r", s=50, alpha=1) 35 36# ラベルを目盛に 37ax.set_xticks(range(len(xl)), fontsize =6) 38ax.set_xticklabels(xl, fontsize =6) 39ax.set_yticks(range(len(yl)), fontsize =6) 40ax.set_yticklabels(yl, fontsize =6) 41 42plt.show()

イメージ説明

投稿2023/01/06 01:35

can110

総合スコア38266

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問