পাইথনে নেটওয়ার্কেক্স ব্যবহার করে নির্দেশিত গ্রাফগুলি কীভাবে আঁকবেন?


105

আমার স্ক্রিপ্ট থেকে কিছু নোড আসছে যা আমি গ্রাফটিতে মানচিত্র করতে চাই। নীচে, আমি এ থেকে ডি তে যেতে তীর ব্যবহার করতে চাই এবং সম্ভবত প্রান্তটি খুব রঙিন (লাল বা কোনও কিছু) পেতে চাই।

এটি মূলত, অন্যান্য সমস্ত নোড উপস্থিত থাকলে A থেকে D যাওয়ার পথের মতো। আপনি প্রতিটি নোডকে শহর হিসাবে কল্পনা করতে পারেন এবং এ থেকে ডি তে ভ্রমণের জন্য দিকনির্দেশ প্রয়োজন (তীরের মাথা সহ)।

নীচের এই কোডটি গ্রাফ তৈরি করে

import networkx as nx
import numpy as np
import matplotlib.pyplot as plt

G = nx.Graph()
G.add_edges_from(
    [('A', 'B'), ('A', 'C'), ('D', 'B'), ('E', 'C'), ('E', 'F'),
     ('B', 'H'), ('B', 'G'), ('B', 'F'), ('C', 'G')])

val_map = {'A': 1.0,
           'D': 0.5714285714285714,
           'H': 0.0}

values = [val_map.get(node, 0.25) for node in G.nodes()]

nx.draw(G, cmap = plt.get_cmap('jet'), node_color = values)
plt.show()

তবে আমি ছবিতে দেখানোর মতো কিছু চাই।এখানে চিত্র বর্ণনা লিখুন এখানে চিত্র বর্ণনা লিখুন

প্রথম চিত্রের তীর শিরোনাম এবং দ্বিতীয় চিত্রের উপরে লাল রঙের প্রান্তগুলি।

উত্তর:


87

কেবলমাত্র লাল প্রান্তের জন্য তীরগুলি সহ পুরোপুরি উদাহরণস্বরূপ:

import networkx as nx
import matplotlib.pyplot as plt

G = nx.DiGraph()
G.add_edges_from(
    [('A', 'B'), ('A', 'C'), ('D', 'B'), ('E', 'C'), ('E', 'F'),
     ('B', 'H'), ('B', 'G'), ('B', 'F'), ('C', 'G')])

val_map = {'A': 1.0,
           'D': 0.5714285714285714,
           'H': 0.0}

values = [val_map.get(node, 0.25) for node in G.nodes()]

# Specify the edges you want here
red_edges = [('A', 'C'), ('E', 'C')]
edge_colours = ['black' if not edge in red_edges else 'red'
                for edge in G.edges()]
black_edges = [edge for edge in G.edges() if edge not in red_edges]

# Need to create a layout when doing
# separate calls to draw nodes and edges
pos = nx.spring_layout(G)
nx.draw_networkx_nodes(G, pos, cmap=plt.get_cmap('jet'), 
                       node_color = values, node_size = 500)
nx.draw_networkx_labels(G, pos)
nx.draw_networkx_edges(G, pos, edgelist=red_edges, edge_color='r', arrows=True)
nx.draw_networkx_edges(G, pos, edgelist=black_edges, arrows=False)
plt.show()

লাল প্রান্ত


4
আমাদের দু'জন আপডেট হওয়া চিত্রগুলি কী আলাদা তা উন্মাদ। প্রান্তের রঙগুলি বের করার জন্য +1!
এমডিএমএম

আপনার প্রান্তটি (সি, ই) কেন লাল নয়, যদিও এটি উপরের কোড অনুসারে অবশ্যই লাল হতে হবে?
মস্তিষ্কে ঝড়

এই তীরগুলি কেবল আগ্রহের প্রান্তে থাকা কি সম্ভব নয়? উদাহরণস্বরূপ (এ, সি) এবং (সি, ই)
মস্তিষ্কে ঝড়

@ ব্যবহারকারী ১৯৮৮৮7676: আহ, দুঃখিত, (C, E)লাল নয় কারণ আমি red_edgesযখন এখনও আপনার অনির্দেশিত গ্রাফের সাথে কাজ করছিলাম তখনই প্রান্তগুলি থেকে এলোমেলোভাবে বাছাইয়ের জন্য আমি প্রান্তগুলি বেছে নিয়েছি G.edges()। এটা হওয়া উচিত red_edges = [('A', 'C'), ('E', 'C')]
মারিয়াস

@ user1988876: প্রান্ত একমাত্র কিছু তীর থাকার পৃথক কল সম্ভব draw_networkx_edges()। আমি কোডটি সাফ করে দিয়েছি এবং ডিগ্রাফের সমস্যাগুলি ঠিক করেছি।
মারিউস

47

আমি কেবল এটি সম্পূর্ণতার জন্য রেখেছি। আমি মারিয়াস এবং এমডিএমএল থেকে প্রচুর শিখেছি। এখানে প্রান্ত ওজন আছে। তীর সম্পর্কে দুঃখিত। দেখে মনে হচ্ছে যে আমিই একমাত্র বলছি না যে এটি সাহায্য করা যায় না। আমি এটি আইপথন নোটবুক দিয়ে রেন্ডার করতে পারিনি আমাকে পাইথন থেকে সোজা যেতে হয়েছিল যা তাড়াতাড়ি আমার প্রান্তের ওজন পেতে সমস্যা ছিল।

import networkx as nx
import numpy as np
import matplotlib.pyplot as plt
import pylab

G = nx.DiGraph()

G.add_edges_from([('A', 'B'),('C','D'),('G','D')], weight=1)
G.add_edges_from([('D','A'),('D','E'),('B','D'),('D','E')], weight=2)
G.add_edges_from([('B','C'),('E','F')], weight=3)
G.add_edges_from([('C','F')], weight=4)


val_map = {'A': 1.0,
                   'D': 0.5714285714285714,
                              'H': 0.0}

values = [val_map.get(node, 0.45) for node in G.nodes()]
edge_labels=dict([((u,v,),d['weight'])
                 for u,v,d in G.edges(data=True)])
red_edges = [('C','D'),('D','A')]
edge_colors = ['black' if not edge in red_edges else 'red' for edge in G.edges()]

pos=nx.spring_layout(G)
nx.draw_networkx_edge_labels(G,pos,edge_labels=edge_labels)
nx.draw(G,pos, node_color = values, node_size=1500,edge_color=edge_colors,edge_cmap=plt.cm.Reds)
pylab.show()

এখানে চিত্র বর্ণনা লিখুন


9
আমি এটি চালিয়েছি এবং নোড লেবেলগুলি পাইনি। আপনি এই যোগ করার জন্য প্রয়োজন: node_labels = {node:node for node in G.nodes()}; nx.draw_networkx_labels(G, pos, labels=node_labels)
মেডেফায়ার

এবং যদি আপনার ইতিমধ্যে একটি অনির্দেশিত গ্রাফ রয়েছে এবং এর একটি নির্দেশিত অনুলিপি পুনরুত্পাদন করতে চান? G.add_edges_from()শুরু এবং শেষ পয়েন্টটি ম্যানুয়ালি প্রবেশ না করেই কি লাইন স্থাপনের কোনও উপায় আছে ? সম্ভবত একটি থেকে কিনারা যুক্ত dict?
ফ্যাকফি 11

এই বিভাগের কোডের প্রথম লাইনটি (আমদানি লাইনগুলি ব্যতীত) সেট করে যে এটি কোন ধরণের গ্রাফ এবং কোন ধরণের প্রান্তগুলি গ্রহণ করে। আপনি একটি ডিগ্রাফ (আরও তথ্য) থেকে গ্রাফে যেতে পারেন (কম তথ্য) তবে আপনি কোনও গ্রাফ (কম তথ্য) থেকে কোনও তথ্য বা এই অনুপস্থিত তথ্যটি তৈরির উপায় ছাড়া একটি ডিগ্রাফ (আরও তথ্য) যেতে পারবেন না। আমি আপনার প্রশ্নটিকে অন্য একটি স্ট্যাক ওভারফ্লো প্রশ্নে একটি উদাহরণ দিয়ে রাখার পরামর্শ দেব।
ব্যাক

4
প্রান্তগুলিতে কি সত্যিকারের তীরগুলি পাওয়া সম্ভব? আমি ঠিক ঘন শেষ পছন্দ করি না।
উইকুনিয়া

4
ম্যাটপ্লোটিলেবটিতে তীরচিহ্নগুলি আঁকানো কৌশলযুক্ত এবং বর্তমানে নেটওয়ার্কএক্সএক্স সমর্থিত নয়। টান অনুরোধ গ্রহণ করা হয়।
ব্যাক

35

নিয়মিত এনএক্স.ড্রেডের পরিবর্তে আপনি ব্যবহার করতে পারেন:

nx.draw_networkx(G[, pos, arrows, with_labels])

উদাহরণ স্বরূপ:

nx.draw_networkx(G, arrows=True, **options)

আপনি ** এর মত চলকটি শুরু করে বিকল্পগুলি যুক্ত করতে পারেন:

options = {
    'node_color': 'blue',
    'node_size': 100,
    'width': 3,
    'arrowstyle': '-|>',
    'arrowsize': 12,
}

এছাড়াও কিছু ফাংশন সমর্থন করে directed=True parameter এই ক্ষেত্রে এই রাজ্যটি পূর্বনির্ধারিত একটি:

G = nx.DiGraph(directed=True)

নেটওয়ার্কএক্স রেফারেন্সটি এখানে পাওয়া যায় ।

তীর চিত্র সহ গ্রাফ


21

আপনাকে গ্রাফের পরিবর্তে নির্দেশিত গ্রাফ ব্যবহার করতে হবে , অর্থাত্‍

G = nx.DiGraph()

তারপরে, আপনি যে প্রান্ত রঙগুলি ব্যবহার করতে চান তার একটি তালিকা তৈরি করুন এবং nx.drawসেগুলিতে পাস করুন (@ মারিয়াস দেখানো হয়েছে)।

এই সব একসাথে রেখে, আমি নীচের চিত্রটি পাই। তবুও আপনি প্রদর্শিত অন্যান্য ছবিটি ঠিক নয় (আপনার প্রান্তের ওজনগুলি কোথা থেকে এসেছে তা আমি জানি না), তবে আরও কাছাকাছি! আপনি যদি নিজের আউটপুট গ্রাফটি দেখতে কেমন তার আরও নিয়ন্ত্রণ চান (উদাহরণস্বরূপ তীরের মতো দেখতে তীরচিহ্নগুলি পান), আমি গ্রাফভিজের সাথে নেটওয়ার্কএক্স পরীক্ষা করে দেখি

এখানে চিত্র বর্ণনা লিখুন


আহা চিয়ার্স, ডকুমেন্টেশনে তাদের পক্ষে যুক্তিগুলি দেখতে পাওয়ায় তীরগুলি কেন কাজ করছে না তা আমি বুঝতে পারি না।
মারিয়াস

9
import networkx as nx
import matplotlib.pyplot as plt

g = nx.DiGraph()
g.add_nodes_from([1,2,3,4,5])
g.add_edge(1,2)
g.add_edge(4,2)
g.add_edge(3,5)
g.add_edge(2,3)
g.add_edge(5,4)

nx.draw(g,with_labels=True)
plt.draw()
plt.show()

নেটওয়ার্কেক্স ব্যবহার করে পাইথন 3.x ব্যবহার করে নির্দেশিত গ্রাফটি কীভাবে আঁকবেন এটি কেবল সহজ। কেবল সাধারণ উপস্থাপনা এবং পরিবর্তিত এবং রঙিন হতে পারে ইত্যাদি উত্পন্ন গ্রাফটি এখানে দেখুন

দ্রষ্টব্য: এটি কেবল একটি সরল উপস্থাপনা। ওজনযুক্ত প্রান্তগুলি যুক্ত করা যেতে পারে

g.add_edges_from([(1,2),(2,5)], weight=2)

এবং তাই আবার চক্রান্ত।


2
import networkx as nx
import matplotlib.pyplot as plt

G = nx.DiGraph()
G.add_node("A")
G.add_node("B")
G.add_node("C")
G.add_node("D")
G.add_node("E")
G.add_node("F")
G.add_node("G")
G.add_edge("A","B")
G.add_edge("B","C")
G.add_edge("C","E")
G.add_edge("C","F")
G.add_edge("D","E")
G.add_edge("F","G")

print(G.nodes())
print(G.edges())

pos = nx.spring_layout(G)

nx.draw_networkx_nodes(G, pos)
nx.draw_networkx_labels(G, pos)
nx.draw_networkx_edges(G, pos, edge_color='r', arrows = True)

plt.show()
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.