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

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

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

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

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Python

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

Q&A

0回答

670閲覧

NetworkxとMatplotlibを用いて3次元のグラフを出力したいと考えています。

netwrokxxxx

総合スコア12

Matplotlib

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

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Python

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

0グッド

1クリップ

投稿2022/11/02 02:04

編集2022/11/15 01:39

前提

試作として2次元のグラフを出力することができました。ソースコードを記しておきます。
このグラフを3次元で出力してみたいと考え、既存のコードをいじくりまわしていましたが、いろいろ調査してみましたが手詰まりとなってしまいました。
そこで調査不足と指摘されることを覚悟の上でteratailに質問を投稿するに至りました。

実現したいこと

現在、主に実現したいことはこれら3つです。

  • 後にリンクを上書きして比較を行いたいため、TkenterのUIはできる限り変更したくない。
  • リンクの密集具合に比例してノードの大きさをより大きく見せる。
  • テキストファイルのトポロジー情報を読み込んでグラフを出力したい。

該当のソースコード

※冗長になるため、ある程度ソースコードを削っています。そのため、どこかしら不自然な点があるかもしれませんがご了承ください。

  • 2次元のグラフを出力するソースコード

python3.6

1import networkx as nx 2from networkx.algorithms.centrality.betweenness_subset import edge_betweenness_centrality_subset 3import matplotlib.pyplot as plt 4import tkinter as tk 5from tkinter import messagebox 6import tkinter.filedialog as fd 7 8# 入力ウインドウの設定 9tki = tk.Tk() # Tkクラス生成 10tki.geometry('350x300') # 画面サイズ 11tki.title('2次元リンク') # 画面タイトル 12 13# チェックボタンのラベルをリスト化する 14chk_txt = ['通常ネットワークの可視化'] 15chk_bln = {} #チェックボックスON/OFFの状態 16 17# チェックボタンを動的に作成して配置 18for i in range(len(chk_txt)): 19 chk_bln[i] = tk.BooleanVar() 20 chk = tk.Checkbutton(tki, 21 variable=chk_bln[i], 22 text=chk_txt[i]) 23 chk.place(x=50, 24 y=30 + (i * 24)) 25 26path = fd.askopenfilename() 27 28# 終了するためのコマンド 29def close_window(): 30 tki.destroy() 31 32# ボタン作成 33btn3 = tk.Button(tki, 34 text = '    決定    ') 35btn3.place(x = 100 , y = 200) 36 37btn4 = tk.Button(tki, 38 text = '終了', 39 command = close_window) 40btn4.place(x = 150 , y = 250) 41 42# グラフウインドウの設定 43# タイトルで漢字が使えるようフォントを設定 44plt.rcParams['font.family'] = 'Meiryo' 45 46# エッジのリストを読み込む 47G = nx.read_edgelist(path, 48 nodetype=int) 49edge_size = nx.number_of_edges(G) # リンク数 50node_size = nx.number_of_nodes(G) # ノード数 51 52# 図のレイアウト決定 53pos = nx.spring_layout(G, k=0.8) 54degs = dict(G.degree) 55 56# 図の作成 57plt.figure(figsize=(15, 15)) 58plt.title("グラフ", 59 fontsize = 30, 60 fontweight = 'bold') 61 62# ノード 63# ノードの大きさを決定 64average_deg = sum(d for n,d in G.degree()) / G.number_of_nodes() #ネットワーク全体の時数の平均値を計算 65sizes = [300 * deg * 2 / average_deg for node,deg in G.degree()] #ノードの次数に比例するようにサイズを設定 66 67# ノード・ラベルの描画 68nx.draw_networkx_nodes(G, 69 pos, 70 node_color = 'w', 71 edgecolors = "k", 72 alpha = 0.75, 73 node_size = sizes, 74 linewidths = 2) 75nx.draw_networkx_labels(G, 76 pos, 77 font_size = 10) 78 79# トポロジー情報(.txt)の読み込み 80with open(path, "r") as tf: 81 line = tf.read().split() 82ran = int(len(line) / 2) 83 84# グラフの出力 85# ボタンクリックイベント(チェック有無をセット) 86def btn_click(bln): 87 for i in range(len(chk_bln)): 88 chk_bln[i].set(bln) 89 90# 各イベントごとの描画方法 91def while_1(event): 92 if(chk_bln[0].get() == True): 93 #通常リンク描画 94 nx.draw_networkx_edges(G, 95 pos, 96 edge_color = 'c') 97 plt.show() 98 99#ボタンに関数をbind 100btn3.bind('<Button-1>',while_1)
  • 3次元のグラフを出力するためにこねくり回したソースコード

python3.6

1import matplotlib.pyplot as plt 2from mpl_toolkits.mplot3d import Axes3D 3import networkx as nx 4import numpy as np 5import tkinter as tk 6from tkinter import messagebox 7import tkinter.filedialog as fd 8 9# 入力ウインドウの設定 10#省略 11 12#タイトルで漢字が使えるようフォントを設定 13plt.rcParams['font.family'] = 'Meiryo' 14 15# エッジデータを生成 16with open(path, "r") as tf: 17 line = tf.read().split() 18ran = int(len(line) / 2) 19 20# 生成したエッジデータからグラフ作成 21G = nx.read_edgelist(path, 22 nodetype=int) 23edge_size = nx.number_of_edges(G) # リンク数 24node_size = nx.number_of_nodes(G) # ノード数 25 26# spring_layout アルゴリズムで、3次元の座標を生成する 27pos = nx.spring_layout(G, k = 0.8, dim = 3) 28degs = dict(G.degree) 29 30# 辞書型から配列型に変換 31pos_ary = np.array([pos[n] for n in G]) 32 33# ここから可視化 34fig = plt.figure() 35ax = fig.add_subplot(121, projection="3d") 36 37#グラフタイトルを設定 38ax.set_title("3Dでグラフを可視化",size=20) 39 40# 各ノードの位置に点を打つ 41ax.scatter( 42 pos_ary[:, 0], 43 pos_ary[:, 1], 44 pos_ary[:, 2], 45 s=50, 46) 47 48# ノードにラベルを表示する 49for n in G.nodes: 50 ax.text(*pos[n], n) 51 52 # ノードにラベルを表示する 53for n in G.nodes: 54 ax.text(*pos[n], n) 55 56# エッジの表示 57for e in G.edges: 58 node0_pos = pos[e[0]] 59 node1_pos = pos[e[1]] 60 xx = [node0_pos[0], node1_pos[0]] 61 yy = [node0_pos[1], node1_pos[1]] 62 zz = [node0_pos[2], node1_pos[2]] 63 ax.plot(xx, yy, zz, c="#aaaaaa") 64 65# 8_グラフの出力 66# 8.1_ボタンクリックイベント(チェック有無をセット) 67def btn_click(bln): 68 for i in range(len(chk_bln)): 69 chk_bln[i].set(bln) 70 71# 8.2_各イベントごとの描画方法 72def while_1(event): 73 if(chk_bln[0].get() == True): 74 #通常リンク描画 75 nx.draw_networkx_edges(G, 76 pos#_ary[:,2], 77 #edge_color = 'c' 78 ) 79 #出来上がった図を表示 80 plt.show() 81 82#ボタンに関数をbind 83btn3.bind('<Button-1>',while_1)

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

※個人情報があるため、その部分は伏せさせていただきます。

Exception in Tkinter callback Traceback (most recent call last): File "C:\Program Files\Python36\lib\tkinter\__init__.py", line 1705, in __call__ return self.func(*args) File "C:/Program Files/Python36/3D_test2.py", line 106, in while_1 ,edge_color = 'c' File "C:\Users\████\AppData\Roaming\Python\Python36\site-packages\networkx\drawing\nx_pylab.py", line 684, in draw_networkx_edges alpha=alpha, File "C:\Users\████\AppData\Roaming\Python\Python36\site-packages\matplotlib\collections.py", line 1393, in __init__ self.set_segments(segments) File "C:\Users\████\AppData\Roaming\Python\Python36\site-packages\matplotlib\collections.py", line 1408, in set_segments self._paths = [mpath.Path(_seg) for _seg in _segments] File "C:\Users\████\AppData\Roaming\Python\Python36\site-packages\matplotlib\collections.py", line 1408, in <listcomp> self._paths = [mpath.Path(_seg) for _seg in _segments] File "C:\Users\████\AppData\Roaming\Python\Python36\site-packages\matplotlib\path.py", line 132, in __init__ cbook._check_shape((None, 2), vertices=vertices) File "C:\Users\████\AppData\Roaming\Python\Python36\site-packages\matplotlib\cbook\__init__.py", line 2304, in _check_shape f"{k!r} must be {len(target_shape)}D " ValueError: 'vertices' must be 2D with shape (M, 2). Your input has shape (2, 3).
  • トポロジー情報

topology.txt

11 10 21 11 31 14 41 20 52 9 62 12 72 13 82 15 92 16 103 10 113 11 123 20 134 5 144 8 154 9 165 4 175 9 186 7 196 14 207 6 217 18 228 4 238 11 248 14 258 19 269 2 279 4 289 5 2910 1 3010 3 3111 1 3211 3 3311 8 3411 13 3512 2 3612 16 3713 2 3813 11 3914 1 4014 6 4114 8 4215 2 4315 17 4415 21 4516 2 4616 12 4717 15 4818 7 4918 21 5019 8 5119 20 5220 1 5320 3 5420 19 5520 21 5621 15 5721 18 5821 20

試したこと

106行目の「edge_color = 'c'」をコメントアウトしていますが、これは上記と同様のエラーが発生したためです。

補足情報

python 3.6.8
networkx 2.5.1
matplotlib 3.3.4

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

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

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

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

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

PondVillege

2022/11/02 02:33

エラー文は全文掲載願います
netwrokxxxx

2022/11/02 02:51

コメントありがとうございました。 アドバイスを反映し全文掲載いたしました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだ回答がついていません

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

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

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問