2011-01-12 13 views
28

khung vẽ đồ thị Java mã nguồn mở nào để sử dụng cho sơ đồ mạng với các yêu cầu sau? Biểu đồ sẽ có ít hơn 1000 nút.so sánh các khung vẽ biểu đồ java mã nguồn mở (JUNG và Prefuse) để vẽ cấu trúc liên kết mạng

1) có cạnh song song
2) đạo diễn và các cạnh vô hướng trong một đồ thị đơn
3) node đại diện bởi hình ảnh
4) tương tác người dùng với các nút và cạnh
5) tự động thêm/xóa nút và các cạnh
6) nhiều ghi nhãn trên các nút và cạnh, các mức độ ghi nhãn khác nhau có thể được tắt/bật bởi người dùng. (như vẽ trong lớp và tắt/trên một lớp)
7) các thuật toán bố cục khác nhau để hiển thị hình sao, vòng, lưới topo

Tôi đã đánh giá JUNG và Prefuse. Đây là những gì tôi tìm thấy cho mỗi yêu cầu của tôi.

1) Tiền tố không thể hiển thị các cạnh song song trong khi JUNG hỗ trợ nó. Có thể sử dụng mã prefuse để hiển thị các cạnh song song không? Vì điều này liên quan đến các thay đổi mức dữ liệu cơ bản, tôi tin rằng điều này sẽ khó khăn hơn khi các thay đổi hiển thị tùy chỉnh thông thường.

2) Tôi không tìm thấy bất kỳ tham chiếu nào đến biểu đồ kết hợp (cả hai cạnh được hướng và không bị gạch) trong cả tiền tố và JUNG. Có ai biết khác không?

3) Điều này có vẻ dễ dàng với cả hai Prefuse và JUNG

4) Một lần nữa cả hai prefuse và JUNG cung cấp hỗ trợ cho tương tác người dùng.

5) Cả tiền tố và JUNG đều hỗ trợ nó. Mỗi khung hoạt động như thế nào trong khi vẽ lại biểu đồ? Tôi thấy trong một bài đăng khác mà tiền sử dụng không hoạt động tốt cho các cập nhật động (Prefuse Toolkit: dynamically adding nodes and edges)

6) Điều này đi xuống để sửa đổi biểu đồ và vẽ lại nó. Vì vậy, câu hỏi sẽ giống như 5)

7) Cả JUNG và prefuse đều có nhiều thuật toán bố cục. Nhưng khi tôi cố gắng hiển thị cùng một tập dữ liệu bằng cách sử dụng FruchtermanReingoldLayout trong cả hai JUNG và Prefuse tôi nhận được màn hình khác nhau. Bất kỳ ý tưởng tại sao? Bằng cách nào đó các thuật toán bố trí trong Prefuse dường như để hiển thị một bố cục tốt hơn so với trong JUNG (rendering cũng tốt hơn tôi nghĩ) mặc dù hầu hết các thuật toán bố trí trong Prefuse được dựa trên thực hiện JUNG. Bố trí các bố cục thích hợp như ForceDirectedLayout/FruchtermanReingoldLayout và CircleLayout trực tiếp ánh xạ tới hình sao, vòng tròn, cấu trúc liên kết lưới.

Ngoài những yêu cầu này, tiền tố có hỗ trợ tốt cho các biểu thức và ngôn ngữ truy vấn nhưng có vẻ như nó không được phát triển tích cực, không giống như JUNG. cái nào có hình ảnh tốt hơn? Bất kỳ đề xuất nào về cách nào phù hợp và cách khắc phục những thiếu sót?

Bất kỳ khung công tác nào khác mà tôi có thể sử dụng?

+7

+1 cho điều này . Tôi thích thực tế rằng bạn đã thực hiện rất nhiều công việc trước đánh giá hai khả năng và trình bày những phát hiện của bạn. Có rất nhiều giá trị ở đây cho những người khác ngoài câu hỏi của bạn. Đây có thể là "câu hỏi đầu tiên" tốt nhất cho một người dùng mới mà tôi đã thấy trong hai năm ở đây. Tôi sẽ cho nó nhiều hơn nếu tôi có thể. – duffymo

Trả lời

3

Một vài năm trước (2007?) Tôi sử dụng tiền tố để hình dung các bản ghi dữ liệu cuộc gọi. Tôi coi như prefuse, jung, jgraph và một vài người khác và chọn prefuse. Lúc đầu, hơi khó để quấn quanh đầu tôi, nhưng một khi tôi đã quen thuộc với nó thì thật dễ dàng (để mở rộng) và thú vị khi sử dụng. Tôi đoán tương tự có thể nói cho JUNG nhưng tôi không bao giờ thử nó.

1) Trước khi sử dụng, bạn có thể dễ dàng thêm trình kết xuất tùy chỉnh của riêng mình để vẽ các cạnh song song - bạn có thể phân lớp EdgeRenderer mặc định và ghi đè phương thức render(). Không cần "thay đổi mức dữ liệu cơ bản". Đây là tất cả trong phần xem nếu bạn muốn nghĩ về nó như là một công cụ MVC.

2) Đây thực sự không phải là vấn đề. Có nhiều cách để thực hiện việc này: 1) Bạn có thể có hai trình kết xuất - một để vẽ các cạnh được chỉ đạo và một để vẽ các cạnh không bị chiếu và chúng sẽ hoạt động tốt và nhóm các cạnh phù hợp. 2) Đặt cờ (thêm một cột boolean trong bảng sao lưu trong lời nói trước) để cho biết cạnh có được hướng và bỏ qua phần vẽ mũi tên tương ứng trong EdgeRender theo cờ đó hay không.

3) Đây là siêu dễ dàng

4) ditto

5) cuối cùng phát hành prefuse là "prefuse beta phát hành 2007/10/21". Tôi đã sử dụng cái trước đó, trong đó có một điều kiện chủng tộc có thể khi thêm hoặc xóa các nút động - nó thiếu một vài từ khóa được đồng bộ hóa mà tôi đoán. Tôi đã giải quyết bằng cách đảm bảo dừng tất cả hoạt ảnh và hành động (màu, kích thước, bố cục) khi thêm hoặc xóa nút - cũng đừng quên cập nhật chỉ mục lucene của bạn (nếu bạn sử dụng công cụ tìm kiếm được xây dựng sẵn). Cái mới nhất được cho là để giải quyết vấn đề chủng tộc này nhưng tôi chưa bao giờ có cơ hội thử nó.

6) Vì bạn đã đề cập "nhiều nhãn" Tôi nghĩ rằng đây không phải là vấn đề "sửa đổi biểu đồ và vẽ lại biểu đồ" - đó chỉ là vấn đề tùy chỉnh nhãn/cạnh của bạn để chỉ vẽ các nhãn có liên quan. thực sự là một vấn đề lớn. Ngoài ra tôi không nghĩ rằng điều này có liên quan đến 5 ở tất cả.

7) Tôi không ngạc nhiên khi prefuse và JUNG của FruchtermanReingoldLayout là khác nhau - có một vài yếu tố có thể ảnh hưởng đến một trong số họ nút khởi đầu nơi mỗi thực hiện bắt đầu tính toán vì vậy tôi sẽ không lo lắng nhiều về vấn đề này. Nó khá dễ dàng để thử các thuật toán bố cục đồ thị dựng sẵn khác nhau trong tiền tố để bạn có thể tiếp tục và kiểm tra xem cái nào gần nhất với những gì bạn muốn có. Kiểm tra RadialLayout và BalloonTreeLayout cho bố cục ngôi sao. ForceDirectedLayout cần một vài lần lặp lại để vị trí các nút được "ổn định". Lưu ý rằng các lần lặp này là không cần thiết để được hiển thị để bạn có thể chạy nó trong nền và hiển thị kết quả cuối cùng.

Tôi chưa sử dụng JUNG nên tôi không thể nhận xét nhiều về nó.

Dựa trên kinh nghiệm của tôi với tiền sử dụng, tôi khuyên bạn nên sử dụng nó do thiết kế suy nghĩ rất tốt (IMHO) và tách độ tương phản giữa các thành phần. Jeffrey Heer (tác giả tiền đề) thực sự đã làm một công việc tốt ở đó.

Những điều cần xem ra vì nếu bạn sử dụng prefuse (đây là hai "đau-ngón tay cái" mà tôi nhớ rất rõ khi làm việc với prefuse):

1) Có một lỗi mà khi phóng to ra, nhãn nút không được thu nhỏ một cách thích hợp sao cho nó tràn vào hộp giới hạn của nút mà sẽ để lại các tạo phẩm vẽ phông khi nút di chuyển vì trình kết xuất chỉ xóa và vẽ lại nội dung trong hộp giới hạn của nút. IIRC điều này được gây ra bởi một lỗi trong số liệu phông chữ AWT. Cách giải quyết là để lại khoảng trống giữa nhãn và hộp giới hạn nút.

2) Khi mở rộng bố cục tích hợp, bạn có thể gặp một hoặc hai "vấn đề phạm vi" trong đó một thành viên của lớp cha mà bạn muốn truy cập được cấp thuộc tính riêng thay vì được bảo vệ để giải pháp là tự sửa đổi thư viện hoặc tạo một lớp mới mà không kế thừa (có thể hơi đau một chút!). Tôi đoán bạn có thể nói tương tự cho một số thư viện java khác. Không phải ai cũng có lợi ích của việc nhận thức không? :)

Vì bạn đã hỏi câu hỏi này khoảng một tháng trước (tại thời điểm viết bài này) Tôi muốn biết quyết định của bạn là gì và bạn đã quyết định như thế nào nếu bạn tiếp tục triển khai.

2

Tôi biết bạn đã chỉ định jung và prefuse nhưng ... Tôi đã có trải nghiệm tốt với cả TomSawyer và yFiles. Danh sách yêu cầu mà bạn đề xuất là rất cơ bản đối với hai danh sách này - và chúng hỗ trợ nhiều hơn nữa.

Ran.

5

Tôi là một trong những người sáng tạo và người bảo trì của JUNG, vì vậy hãy ghi nhớ những phản hồi dưới đây.

Đầu tiên, tuy nhiên, tôi nên nói rằng tác giả của Prefuse là bạn của một người bạn (và có, chúng tôi đã gặp) và anh ấy đã làm rất tốt. Tôi không có kinh nghiệm với Prefuse, nhưng tôi đã nhìn thấy một số visualizations đẹp tạo ra với nó.

Đây là câu trả lời cho những câu hỏi đó cho JUNG. Một vài trong số họ ((1), (2), (4) được thể hiện trong PluggableRendererDemo:

  1. hỗ trợ (bạn sẽ cần các mô hình dữ liệu đúng, không phải tất cả hỗ trợ cạnh song song vì lý do hiệu suất)
  2. được hỗ trợ (một lần nữa, bạn cần mô hình dữ liệu bên phải)
  3. được hỗ trợ (xem ImageShaperDemo)
  4. được hỗ trợ (hầu hết các bản demo)
  5. được hỗ trợ (xem GraphEditorDemo)
  6. Không hỗ trợ trực tiếp, mặc dù bạn có thể Certa inly thay đổi nhãn động và sử dụng HTML để hiển thị các nhãn phức tạp.
  7. Thuật toán bố cục của JUNG là nhiều hơn cho các mạng chung (với một vài ngoại lệ cho cây cối, v.v.). Bạn chắc chắn có thể xây dựng các thuật toán bố cục của riêng bạn, tuy nhiên, nhiều người đã làm như vậy.

Hy vọng điều này sẽ hữu ích.

0

Tôi thích câu trả lời của @ holygeek. Dưới đây là thực hiện của tôi với các giải pháp cho 2 (cả đạo diễn và các cạnh vô hướng), cho Prefuse:

public class MyRenderFactory implements RendererFactory 
{ 
    private NodeRenderer nodeRenderer = new NodeRenderer(); 
    private EdgeRenderer defaultEdgeRenderer = new EdgeRenderer(); 
    private EdgeRenderer undirectedEdgeRenderer = new EdgeRenderer(EdgeRenderer.EdgeType.LINE, EdgeRenderer.EdgeArrowType.NONE); 

    public static String directedness = "myEdgeDirectedness"; 

    public enum EdgeDirected 
    { 
     directed, undirected; 

     public static EdgeDirected fromIsDirected(boolean isDirected) 
     { 
      if (isDirected) 
      { 
       return directed; 
      } 
      return undirected; 
     } 
    } 

    @Override 
    public Renderer getRenderer(VisualItem<?> visualItem) 
    { 
     if (visualItem instanceof EdgeItem) 
     { 
      if (visualItem.get(directedness).equals(PrefuseGraphConverter.EdgeDirected.undirected)) 
      { 
       return undirectedEdgeRenderer; 
      } 
      return defaultEdgeRenderer; 
     } 
     return nodeRenderer; 
    } 
} 

... ở những nơi khác, nơi mà các đồ thị được tạo ra ...

MyRenderFactory.EdgeDirected directedness = 
     MyRenderFactory.EdgeDirected.fromIsDirected(myEdge.isDirected()); 
prefuseEdge.set(MyRenderFactory.directedness, directedness); 
Các vấn đề liên quan