Python tương đương với D3.js


110

Có ai có thể giới thiệu một thư viện Python có thể trực quan hóa đồ thị tương tác không?

Tôi đặc biệt muốn một cái gì đó giống như d3.js nhưng pythonvà lý tưởng là nó cũng sẽ là 3D.

Tôi đã xem xét:

  • NetworkX - nó chỉ thực hiện Matplotlibcác âm mưu và những thứ đó dường như là 2D. Tôi không thấy bất kỳ loại tương tác nào, giống như một loại d3.jsmang lại, chẳng hạn như kéo các nút xung quanh.
  • công cụ đồ thị - nó chỉ vẽ các đồ thị 2D và có đồ thị tương tác rất chậm .

1
Bạn muốn tạo một biểu đồ trong networkx và sau đó thao tác trong d3.js, nếu bạn đang tìm kiếm một phiên bản dựa trên trình duyệt.
kreativitea 19/10/12


Tôi nghĩ rằng bạn có thể triển khai vega lite trong python. Kiểm tra điều này và tất nhiên.
Noel Harris

Câu trả lời:


74

Bạn có thể sử dụng d3py một mô-đun python tạo các trang xml nhúng tập lệnh d3.js. Ví dụ :

import d3py
import networkx as nx

import logging
logging.basicConfig(level=logging.DEBUG)

G = nx.Graph()
G.add_edge(1,2)
G.add_edge(1,3)
G.add_edge(3,2)
G.add_edge(3,4)
G.add_edge(4,2)

# use 'with' if you are writing a script and want to serve this up forever
with d3py.NetworkXFigure(G, width=500, height=500) as p:
    p += d3py.ForceLayout()
    p.show()

Làm việc cho tôi, nhưng tôi phải chỉnh sửa một trong những dòng thành with d3py.NetworkXFigure(G, width=500, height=500, host="localhost") as p:. Tôi đã kiểm tra cam kết mới nhất của d3py tại github (SHA: 4e92a90f4003370bc086e0f57b19fca1bd4e8fba)
xb.

7
Thật không may, d3py không được phát triển tích cực nữa - Vincent là tương đương hiện đại (giao diện Python cho Vega / d3.js) nhưng câu trả lời của psychemedia bên dưới (xuất mạngx sang json sau đó hiển thị trong d3.js) có thể là rõ ràng nhất.
A.Wan

2
Hãy thử altair-viz.github.io - người kế nhiệm của d3py và vincent. Xem thêm stackoverflow.com/a/49695472/179014 .
asmaier

43

Plotly hỗ trợ vẽ đồ thị 2D và 3D tương tác. Đồ thị được hiển thị bằng D3.js và có thể được tạo bằng API Python , matplotlib , ggplot cho Python , Seaborn , prettyplotlibgấu trúc . Bạn có thể thu phóng, xoay, bật và tắt dấu vết cũng như xem dữ liệu trên di chuột. Các lô có thể được nhúng trong HTML, ứng dụng, trang tổng quan và Máy tính xách tay IPython. Dưới đây là biểu đồ nhiệt độ hiển thị tương tác. Xem thư viện hướng dẫn về IPython Notebooks để biết thêm ví dụ.

nhập mô tả hình ảnh ở đây



Tài liệu cung cấp các ví dụ về các loại cốt truyện và đoạn mã được hỗ trợ.



nhập mô tả hình ảnh ở đây

Cụ thể cho câu hỏi của bạn, bạn cũng có thể tạo các âm mưu tương tác từ NetworkX.

nhập mô tả hình ảnh ở đây

Đối với vẽ đồ thị 3D bằng Python, bạn có thể tạo đồ thị phân tán, đường thẳng và bề mặt 3D tương tác tương tự. Các lô được hiển thị bằng WebGL. Ví dụ: xem biểu đồ 3D về tỷ giá Hoán đổi của Vương quốc Anh.



nhập mô tả hình ảnh ở đây

Tiết lộ: Tôi thuộc đội Âm mưu.


9
Rõ ràng câu hỏi nhắm vào đồ thị theo nghĩa các nút được nối với nhau bằng các cạnh. Câu trả lời này không cần thiết phải bao gồm các khả năng hình dung khác của cốt truyện.
Lutz Büch,

@ mateo-sanchez nó là rất đáng tiếc rằng Plotly đã quyết định chấm dứt tất cả đăng ký học tập và cá nhân để tập trung vào khách hàng doanh nghiệp
Andreuccio

20

Bạn đã nhìn vào vincent chưa? Vincent lấy các đối tượng dữ liệu Python và chuyển đổi chúng sang ngữ pháp trực quan hóa Vega. Vega là một công cụ trực quan hóa cấp cao hơn được xây dựng trên D3. So với D3py, repo vincent đã được cập nhật gần đây hơn. Mặc dù các ví dụ đều là D3 tĩnh.

thêm thông tin:


Các đồ thị có thể được xem trong Ipython, chỉ cần thêm mã này

vincent.core.initialize_notebook()

Hoặc xuất ra JSON nơi bạn có thể xem biểu đồ đầu ra JSON trong trình chỉnh sửa trực tuyến Vega ( http://trifacta.github.io/vega/editor/ ) hoặc xem chúng trên máy chủ Python cục bộ. Có thể tìm thấy thêm thông tin về cách xem trong liên kết pypi ở trên.

Không chắc chắn khi nào, nhưng gói Pandas sẽ có tích hợp D3 vào một thời điểm nào đó. http://pandas.pydata.org/developers.html

Bokeh là một thư viện trực quan hóa Python hỗ trợ trực quan hóa tương tác. Phần phụ trợ đầu ra chính của nó là HTML5 Canvas và sử dụng mô hình máy khách / máy chủ.

ví dụ: http://continuumio.github.io/bokehjs/


2
Vincent là trên đường ra - trông giống như có một số thay thế, nhưng tôi không chắc chắn cách chặt chẽ gắn với ipython họ sẽ ..
naught101

19

Một công thức mà tôi đã sử dụng (được mô tả ở đây: Tệp dữ liệu mạng đồng giám đốc trong GEXF và JSON từ Dữ liệu OpenCorporate qua Scraperwiki và networkx ) chạy như sau:

  • tạo đại diện mạng bằng networkx
  • xuất mạng dưới dạng tệp JSON
  • nhập khẩu mà JSON vào để d3.js . ( networkx có thể xuất cả biểu diễn dạng cây và đồ thị / mạng mà d3.js có thể nhập).

Nhà xuất khẩu JSON của networkx có dạng:

from networkx.readwrite import json_graph
import json
print json.dumps(json_graph.node_link_data(G))

Ngoài ra, bạn có thể xuất mạng dưới dạng tệp XML GEXF và sau đó nhập biểu diễn này vào thư viện trực quan hóa Javascript sigma.js .

from xml.etree.cElementTree import tostring
writer=gf.GEXFWriter(encoding='utf-8',prettyprint=True,version='1.1draft')
writer.add_graph(G)
print tostring(writer.xml)


7

Đối với những người đã đề xuất pyd3 , nó không còn được phát triển tích cực nữa và chỉ bạn đến vincent . vincent cũng không còn được phát triển tích cực và khuyến nghị sử dụng altair .

Vì vậy, nếu bạn muốn có một pythonic d3, hãy sử dụng altair.



5

Kiểm tra python-nvd3 . Nó là một trình bao bọc python cho nvd3. Trông ngầu hơn d3.py và cũng có nhiều tùy chọn biểu đồ hơn.


4

Tôi sẽ đề xuất sử dụng mpld3 kết hợp trực quan hóa javascript D3js với matplotlib của python.

Việc cài đặt và sử dụng thực sự đơn giản và nó có một số plugin và nội dung tương tác thú vị.

http://mpld3.github.io/


3

Âm mưu có thể làm một số điều thú vị cho bạnnhập mô tả hình ảnh ở đây

https://plot.ly/

Tạo ra các đồ thị có tính tương tác cao có thể dễ dàng nhúng vào các trang HTML cho máy chủ hoặc trang web riêng của bạn bằng cách sử dụng API ngoại tuyến của nó.

Cập nhật: Tôi lưu ý chắc chắn về khả năng vẽ đồ thị 3D của nó, đối với đồ thị 2D thật tuyệt vời Cảm ơn


2
Lưu ý rằng đây là trực quan hóa biểu đồ ... Câu hỏi yêu cầu trực quan hóa biểu đồ . (Tôi đánh giá cao những cụm từ này thường được sử dụng chung!)
j6m8 Ngày

2

Bạn cũng có thể chọn tuần tự hóa dữ liệu của mình và sau đó trực quan hóa nó trong D3.js, như được thực hiện ở đây: Sử dụng Python & Pandas để tạo Sơ đồ mạng được hướng dẫn D3 (Nó cũng đi kèm với một sổ ghi chép jupyter !)

Đây là ý chính. Bạn tuần tự hóa dữ liệu đồ thị của mình theo định dạng sau:

import json
json_data = {
  "nodes":[
    {"name":"Myriel","group":1},
    {"name":"Napoleon","group":1},
    {"name":"Mlle.Baptistine","group":1},
    {"name":"Mme.Magloire","group":1},
    {"name":"CountessdeLo","group":1},
  ],
  "links":[
    {"source":1,"target":0,"value":1},
    {"source":2,"target":0,"value":8},
    {"source":3,"target":0,"value":10},
    {"source":3,"target":2,"value":6},
    {"source":4,"target":0,"value":1},
    {"source":5,"target":0,"value":1},
  ]
}
filename_out = 'graph_data.json'
json_out = open(filename_out,'w')
json_out.write(json_data)
json_out.close()

Sau đó, bạn tải dữ liệu vào bằng d3.js:

d3.json("pcap_export.json", drawGraph);

drawGraphTuy nhiên, đối với thói quen tôi giới thiệu bạn đến liên kết.


Tôi đã chỉnh sửa nó ngay bây giờ, nhưng tôi không bao gồm quy trình drawGraph mà chính nó gọi là drawLinks và drawNodes. Nó sẽ quá cồng kềnh và các phần tử chỉ có ý nghĩa trong ngữ cảnh của toàn bộ tệp html.
Lutz Büch

1

Có một cổng thú vị của NetworkX sang Javascript có thể làm những gì bạn muốn. Xem http://felix-kling.de/JSNetworkX/


cái này có thể hoạt động .... bạn có thể cho tôi tham khảo tài liệu được không? Làm cách nào để xuất một biểu đồ từ python vào thư viện javascript này ...? Tôi muốn tạo nó trong python trước ... hoặc làm cách nào để tải nó?
Eiyrioü von Kauyf

Tôi thực sự chưa bao giờ sử dụng JSNetworkX nên tôi không chắc nó hoạt động như thế nào.
Aric

@ EiyrioüvonKauyf: Đầu vào giống như trong Python, ví dụ: một danh sách các danh sách hoặc một mệnh đề của số. Bạn có thể xây dựng biểu đồ bằng Python, chuyển đổi nó thành một danh sách các danh sách và chuyển nó sang JSON.
Felix Kling

Vâng, chắc chắn là dễ dàng. Các ví dụ ở đây rất đơn giản và đẹp mắt: felix-kling.de/JSNetworkX/examples
Aric

1

Xem:

Có thư viện đồ thị 3D tương tác tốt ngoài kia không?

Câu trả lời được chấp nhận gợi ý chương trình sau, chương trình này rõ ràng có liên kết python: http://ubietylab.net/ubigraph/

Biên tập

Tôi không chắc về khả năng tương tác của NetworkX, nhưng bạn chắc chắn có thể tạo đồ thị 3D. Có ít nhất một ví dụ trong thư viện:

http://networkx.lanl.gov/examples/drawing/edge_colormap.html

Và một ví dụ khác trong 'ví dụ'. Tuy nhiên, cái này yêu cầu bạn phải có Mayavi.

http://networkx.lanl.gov/examples/3d_drawing/mayavi2_spring.html


0

Tôi có một ví dụ điển hình về việc tự động tạo sơ đồ mạng D3.js bằng Python tại đây: http://brandonrose.org/ner2sna

Điều thú vị là bạn kết thúc với HTML và JS được tạo tự động và có thể nhúng biểu đồ D3 tương tác vào sổ tay với IFrame


0

Thư viện d3graphsẽ xây dựng một đồ thị d3 hướng lực từ bên trong python. Bạn có thể "phá vỡ" mạng dựa trên trọng lượng cạnh và di chuột qua các nút để biết thêm thông tin. Nhấp đúp vào một nút sẽ tập trung vào nút và các cạnh được kết nối của nó.

pip install d3graph

Thí dụ:

source = ['node A','node F','node B','node B','node B','node A','node C','node Z']
target = ['node F','node B','node J','node F','node F','node M','node M','node A']
weight = [5.56, 0.5, 0.64, 0.23, 0.9,3.28,0.5,0.45]

# Import library
from d3graph import d3graph, vec2adjmat

# Convert to adjacency matrix
adjmat = vec2adjmat(source, target, weight=weight)
print(adjmat)
# target  node A  node B  node F  node J  node M  node C  node Z
# source                                                        
# node A    0.00     0.0    5.56    0.00    3.28     0.0     0.0
# node B    0.00     0.0    1.13    0.64    0.00     0.0     0.0
# node F    0.00     0.5    0.00    0.00    0.00     0.0     0.0
# node J    0.00     0.0    0.00    0.00    0.00     0.0     0.0
# node M    0.00     0.0    0.00    0.00    0.00     0.0     0.0
# node C    0.00     0.0    0.00    0.00    0.50     0.0     0.0
# node Z    0.45     0.0    0.00    0.00    0.00     0.0     0.0

# Example A: simple interactive network
out = d3graph(adjmat)

# Example B: Color nodes
out = d3graph(adjmat, node_color=adjmat.columns.values)

# Example C: include node size
node_size = [10,20,10,10,15,10,5]
out = d3graph(adjmat, node_color=adjmat.columns.values, node_size=node_size)

# Example D: include node-edge-size
out = d3graph(adjmat, node_color=adjmat.columns.values, node_size=node_size, node_size_edge=node_size[::-1], cmap='Set2')

# Example E: include node-edge color
out = d3graph(adjmat, node_color=adjmat.columns.values, node_size=node_size, node_size_edge=node_size[::-1], node_color_edge='#00FFFF')

# Example F: Change colormap
out = d3graph(adjmat, node_color=adjmat.columns.values, node_size=node_size, node_size_edge=node_size[::-1], node_color_edge='#00FFFF', cmap='Set2')

# Example H: Include directed links. Arrows are set from source -> target
out = d3graph(adjmat, node_color=adjmat.columns.values, node_size=node_size, node_size_edge=node_size[::-1], node_color_edge='#00FFFF', cmap='Set2', directed=True)

Ví dụ về d3graph

Có thể tìm thấy ví dụ tương tác từ trường hợp titanic tại đây: https://erdogant.github.io/docs/d3graph/titanic_example/index.html https://erdogant.github.io/hnet/pages/html/Use%20Cases .html

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.