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

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

ただいまの
回答率

87.59%

CSVファイルを取り込んでネットワーク図を描画したい

解決済

回答 2

投稿 編集

  • 評価
  • クリップ 1
  • VIEW 1,835

score 19

▼実現したいこと
・こちらにあるような形式のCSVファイルを取り込んで、NetworkXを使って無向グラフのネットワーク図を描画したいと考えております。

・データにある'waight'を判別して、ネットワーク図のエッジの太さを可変にする。

▼環境
・Python 3.7.3
・NetworkX

▼試したコード

import networkx as nx
import csv
import pandas as pd

# csvファイルの読み込み
Data = open('test.csv', "r")
next(Data, None)  # CSVデータの最初の行をスキップ
Graphtype = nx.Graph()  # 無向グラフを定義

G = nx.parse_edgelist(Data, delimiter=',', create_using=Graphtype,
                      nodetype=int, data=(('weight', float),))

for x in G.nodes():
      print ("Node:", x, "has total #degree:",G.degree(x), " , In_degree: ", G.out_degree(x)," and out_degree: ", G.in_degree(x))   
for u,v in G.edges():
      print ("Weight of Edge ("+str(u)+","+str(v)+")", G.get_Edge_data(u,v))

nx.draw(G)
plt.show()

▼エラーの内容
その結果、下から5行目の「 print ("Node:", x、、、、、」ところでアトリビュートエラーが発生してしまいます。

AttributeError: 'Graph' object has no attribute 'out_degree'

これを解決する方法をご教示いただけませんでしょうか。

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 2

checkベストアンサー

0

これを解決する方法をご教示いただけませんでしょうか。

エラーの意味としては無向グラフにはout_degreeはないと云われています。
有効グラフにはnetworkx.DiGraph.out_degreeがあるのでGraphtypeを変更すれば動作するようにはなります。

・データにある'waight'を判別して、ネットワーク図のエッジの太さを可変にする。

networkx - change color/width according to edge attributes - inconsistent resultが参考になります。

他に

  • parse_edgelist関数におけるデータの与え方
  • weightのprint部分

がおかしいです。修正したコードを以下に示します。

import networkx as nx
import matplotlib.pyplot as plt

# csvファイルの読み込み
Data = open('net_test2.csv', "r")
next(Data, None)  # CSVデータの最初の行をスキップ

#Graphtype = nx.Graph()  # 無向グラフを定義
Graphtype = nx.DiGraph() # 有向グラフ

lines = Data.readlines() # 読み込む
G = nx.parse_edgelist(lines, delimiter=',', create_using=Graphtype,
                      nodetype=int, data=(('weight', float),))

# networkx - change color/width according to edge attributes - inconsistent result
# https://stackoverflow.com/questions/25639169/networkx-change-color-width-according-to-edge-attributes-inconsistent-result
edges = G.edges()
weights = [G[u][v]['weight'] for u,v in edges]

for x in G.nodes():
    print ("Node:", x, "has total #degree:",G.degree(x), " , In_degree: ", G.out_degree(x)," and out_degree: ", G.in_degree(x))   
# Node: 1 has total #degree: 1  , In_degree:  1  and out_degree:  0
# Node: 2 has total #degree: 2  , In_degree:  1  and out_degree:  1
# Node: 3 has total #degree: 2  , In_degree:  1  and out_degree:  1
# Node: 4 has total #degree: 1  , In_degree:  0  and out_degree:  1

for u,v in G.edges():
    print ("Weight of Edge ("+str(u)+","+str(v)+")", G[u][v]['weight'])
# Weight of Edge (1,2) 1.0
# Weight of Edge (2,3) 2.0
# Weight of Edge (3,4) 3.0

nx.draw(G, width=weights)
plt.show()

net_test2.csv

target,source,weight
1,2,1
2,3,2
3,4,3

イメージ説明

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2020/07/23 12:14

    can110さん

    ご丁寧に有難う御座いました!しっかり理解できました。

    無向グラフにして、
    out_degreeとin_degreeも消したら
    無向グラフも描画できました!

    おせわになりました。

    キャンセル

0

out_degreeはノードから出ていくエッジの数ということなので、無向グラフだからその属性が無いのではないでしょうか。in_degreeも同様ですね。
networkx.DiGraph.out_degree

あと、G.get_edge_dataが大文字になっていました。
以上を修正したのが下記です。

import networkx as nx
import csv
import pandas as pd

# csvファイルの読み込み
Data = open('test.csv', "r")
next(Data, None)  # CSVデータの最初の行をスキップ
Graphtype = nx.Graph()  # 無向グラフを定義

G = nx.parse_edgelist(Data, delimiter=',', create_using=Graphtype,
                      nodetype=int, data=(('weight', float),))

for x in G.nodes():
      print ("Node:", x, "has total #degree:",G.degree(x))   
for u,v in G.edges():
      print ("Weight of Edge ("+str(u)+","+str(v)+")", G.get_edge_data(u,v))

nx.draw(G)
plt.show()
"""
Node: 202 has total #degree: 1
Node: 237 has total #degree: 1
Node: 280 has total #degree: 1
Node: 281 has total #degree: 1
Node: 118 has total #degree: 2
Node: 38 has total #degree: 9
Node: 139 has total #degree: 9
Node: 158 has total #degree: 9
Node: 160 has total #degree: 11
Node: 236 has total #degree: 9
Node: 282 has total #degree: 11
Node: 283 has total #degree: 9
Node: 284 has total #degree: 9
Node: 285 has total #degree: 9
Node: 286 has total #degree: 9
Node: 6 has total #degree: 3
Node: 240 has total #degree: 3
Weight of Edge (202,237) {'weight': 1.0}
Weight of Edge (280,281) {'weight': 1.0}
Weight of Edge (118,118) {'weight': 1.0}
Weight of Edge (38,139) {'weight': 1.0}
Weight of Edge (38,158) {'weight': 1.0}
Weight of Edge (38,160) {'weight': 1.0}
Weight of Edge (38,236) {'weight': 2.0}
Weight of Edge (38,282) {'weight': 1.0}
Weight of Edge (38,283) {'weight': 1.0}
Weight of Edge (38,284) {'weight': 1.0}
Weight of Edge (38,285) {'weight': 1.0}
Weight of Edge (38,286) {'weight': 1.0}
Weight of Edge (139,158) {'weight': 1.0}
Weight of Edge (139,160) {'weight': 1.0}
Weight of Edge (139,236) {'weight': 1.0}
Weight of Edge (139,282) {'weight': 1.0}
Weight of Edge (139,283) {'weight': 1.0}
Weight of Edge (139,284) {'weight': 1.0}
Weight of Edge (139,285) {'weight': 1.0}
Weight of Edge (139,286) {'weight': 1.0}
Weight of Edge (158,160) {'weight': 1.0}
Weight of Edge (158,236) {'weight': 1.0}
Weight of Edge (158,282) {'weight': 1.0}
Weight of Edge (158,283) {'weight': 1.0}
Weight of Edge (158,284) {'weight': 1.0}
Weight of Edge (158,285) {'weight': 1.0}
Weight of Edge (158,286) {'weight': 1.0}
Weight of Edge (160,236) {'weight': 1.0}
Weight of Edge (160,282) {'weight': 2.0}
Weight of Edge (160,283) {'weight': 1.0}
Weight of Edge (160,284) {'weight': 1.0}
Weight of Edge (160,285) {'weight': 1.0}
Weight of Edge (160,286) {'weight': 1.0}
Weight of Edge (160,240) {'weight': 1.0}
Weight of Edge (160,6) {'weight': 1.0}
Weight of Edge (236,282) {'weight': 1.0}
Weight of Edge (236,283) {'weight': 1.0}
Weight of Edge (236,284) {'weight': 1.0}
Weight of Edge (236,285) {'weight': 1.0}
Weight of Edge (236,286) {'weight': 1.0}
Weight of Edge (282,283) {'weight': 1.0}
Weight of Edge (282,284) {'weight': 1.0}
Weight of Edge (282,285) {'weight': 1.0}
Weight of Edge (282,286) {'weight': 1.0}
Weight of Edge (282,6) {'weight': 1.0}
Weight of Edge (282,240) {'weight': 1.0}
Weight of Edge (283,284) {'weight': 1.0}
Weight of Edge (283,285) {'weight': 1.0}
Weight of Edge (283,286) {'weight': 1.0}
Weight of Edge (284,285) {'weight': 1.0}
Weight of Edge (284,286) {'weight': 1.0}
Weight of Edge (285,286) {'weight': 1.0}
Weight of Edge (6,240) {'weight': 2.0}
"""

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2020/07/23 12:14

    jeanbiegoさん

    ご回答頂き有難う御座いました!
    しっかりとグラフが描画できました!
    大変参考になりました。

    キャンセル

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

  • ただいまの回答率 87.59%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る