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

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

新規登録して質問してみよう
ただいま回答率
85.37%
グラフ理論

グラフ理論とは、頂点(node)と辺(edge)で構成されたグラフに関する数学理論で、グラフの多様な性質を探求することを指します。グラフは、頂点と向き(矢印)を持つ辺で構成された有向グラフと、矢印のない無向グラフに分類。さまざまな日常の場面で使用することを目的としている理論です。

機械学習

機械学習は、データからパターンを自動的に発見し、そこから知能的な判断を下すためのコンピューターアルゴリズムを指します。人工知能における課題のひとつです。

Python

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

Q&A

1回答

619閲覧

pythonのネットワーク描写で困っています

kanakann

総合スコア1

グラフ理論

グラフ理論とは、頂点(node)と辺(edge)で構成されたグラフに関する数学理論で、グラフの多様な性質を探求することを指します。グラフは、頂点と向き(矢印)を持つ辺で構成された有向グラフと、矢印のない無向グラフに分類。さまざまな日常の場面で使用することを目的としている理論です。

機械学習

機械学習は、データからパターンを自動的に発見し、そこから知能的な判断を下すためのコンピューターアルゴリズムを指します。人工知能における課題のひとつです。

Python

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

0グッド

0クリップ

投稿2023/05/17 13:42

今現在、グラフィカルモデルを作成しており、ネットワーク図の描写の部分で困っています。
偏相関を計算して、それをもとにネットワークグラフを描写。描写したグラフをもとに、データ解析をしていこうと思っています。共分散などの計算過程は概ね成功していると思うのですが、最後のグラフ表示でうまくいっていません。
動作イメージは、csvファイルを読み込んでそれを元に計算していく感じです。読み込むcsvファイルは、A行と1列目がヘッダーとラベルになっています。

出ているエラーコードは、次の二つです。片方のエラーを修正したら、もう片方が出てしまうのでいつまでたっても修正できません。valid_labelsとvalid_nodes,posの修正を何度か行っているのですが、改善が見られません。
出てしまうエラーは、
Traceback (most recent call last):
File "ーーー", line 130, in <module>
draw_network_graph(G, pos, labels_dict, corr_mat)
File "ーーー", line 29, in draw_network_graph
nx.draw(G, pos=pos, node_size=500, alpha=0.8)
File "ーーー", line 121, in draw
draw_networkx(G, pos=pos, ax=ax, **kwds)
File "ーーー", line 303, in draw_networkx
draw_networkx_nodes(G, pos, **node_kwds)
File "ーーー", line 427, in draw_networkx_nodes
raise nx.NetworkXError(f"Node {err} has no position.") from err
networkx.exception.NetworkXError: Node 5 has no position.

もう一つのエラーが、

Traceback (most recent call last):
File "ーー", line 127, in <module>
pos = {label: pos[i] if label in pos else (0.0, 0.0) for i, label in enumerate(valid_labels)}
File "ーー", line 127, in <dictcomp>
pos = {label: pos[i] if label in pos else (0.0, 0.0) for i, label in enumerate(valid_labels)}
KeyError: 1

です。

グラフ描写をしているプログラムは、次のようになっています。

ネットワーク図を描画する関数

def draw_network_graph(G, pos, labels_dict, corr_mat):
# 相関係数のラベルを作成する
edge_labels = {(i, j): f"{corr_mat[i, j]:.2f}" for i, j in G.edges()}

# ノードを描画する nx.draw(G, pos=pos, node_size=500, alpha=0.8) # ノードのラベルを描画する nx.draw_networkx_labels(G, pos=pos, labels=labels_dict, font_size=10, font_family='Yu Gothic') # エッジのラベルを描画する nx.draw_networkx_edge_labels(G, pos=pos, edge_labels=edge_labels, font_size=10) # 描画領域を非表示にする plt.axis('off')

ネットワーク図の描画に必要なデータを準備する

G = nx.from_numpy_array(cov_mat)
pos = nx.spring_layout(G)
valid_nodes = set(range(len(labels)))

posのキーをラベルに変更する

pos = {labels[i]: pos[i] for i in range(len(labels)) if i in pos and labels[i] != ''}

0をキーとして値を設定する

if 0 not in pos:
pos[0] = (0.0, 0.0)

ノードとラベルを描画する

valid_labels = [label for label in labels if label != '']
valid_nodes = [i for i, label in enumerate(labels) if label != '']
labels_dict = {i: label for i, label in enumerate(valid_labels)}

pos辞書にすべてのノードの位置情報を追加する

pos = {labels[i]: pos[i] for i in range(len(labels)) if i in pos and labels[i] != ''}

draw_network_graph(G, pos, labels_dict, corr_mat)

plt.show()

諸事情で全文ではなく、グラフ描写のところだけですが、修正箇所を教えていただきたいです。

よろしくお願いいたします

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

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

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

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

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

guest

回答1

0

ChatGPTの回答(動作、内容未確認)

エラーメッセージを見ると、ノードの位置情報(pos)の取得やノードの描画で問題が発生しているようです。いくつかの修正点が見受けられますので、以下に修正案を示します。

修正案1:

Python

1pos = {label: pos[i] if i in pos else (0.0, 0.0) for i, label in enumerate(valid_labels)}

修正案2:

Python

1valid_nodes = set(range(len(labels))) - {0} 2G = nx.from_numpy_array(cov_mat, create_using=nx.DiGraph) 3pos = nx.spring_layout(G, k=0.3, iterations=50, seed=42) 4valid_labels = [labels[i] for i in range(len(labels)) if i in valid_nodes and labels[i] != ''] 5labels_dict = {i: label for i, label in enumerate(valid_labels)} 6pos = {label: pos[i] for i, label in enumerate(valid_labels)}

修正案1では、pos辞書のキーがvalid_labelsになるように修正し、存在しないラベルに対してはデフォルトの位置 (0.0, 0.0) を設定しています。

修正案2では、valid_nodesを正しく設定し、有向グラフ (nx.DiGraph) を作成するようにしています。また、posの取得方法を修正し、valid_labelsのラベルに対応する位置情報だけを取得するようにしています。

これらの修正を適用することで、エラーが解消されるか確認してください。

投稿2023/05/18 01:42

can110

総合スコア38339

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

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

kanakann

2023/05/19 13:23

ご回答していただきまして、ありがとうございます。 提案1のほうに関しては、自分の方でも実験済みでしてエラーの改善はありませんでした。 提案2のほうを確認させていただいたのですが、こちらでもエラーが出てしまいました。 networkx.exception.NetworkXError: Node 0 has no position. が発生してしまい、nodeの位置がなくなっているようです。 自分のほうでもいくつか修正をしてみたのですが、keyerrorを含めて堂々巡りになっています
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

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

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

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

ただいまの回答率
85.37%

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

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

質問する

関連した質問