2011-11-19 21 views
5

Đây là một hoạt động BBC graphics. Tôi nghĩ rằng có thể tái tạo đồ họa trong Mathematica.Làm thế nào là cốt truyện năng động này có thể với mathematica?

enter image description here

Trong quá trình trả lời chúng ta sẽ thấy một số thủ thuật đồ họa quyến rũ sẵn trong MMA. Đó là lý do duy nhất để đặt câu hỏi ở đây.

Cập nhật:

tôi chỉ kiểm tra rằng BBC đang sử dụng đơn giản JavaScript để làm điều đó. Họ đã tự tạo các ảnh tĩnh và thậm chí không sử dụng xử lý sự kiện dựa trên Flash. Vì vậy, tất cả các hình ảnh là thực thể tĩnh và một khi chúng ta click vào một quốc gia nó tạo ra một hình ảnh độc đáo. Đối với các quốc gia khác, nó hiển thị các hình ảnh khác. Các hình ảnh riêng biệt cho từng trường hợp có thể được tạo ra thông qua PowerPoint, Visio hoặc thậm chí là Photoshop. Người ta có thể kiểm tra điều này chỉ bằng cách vô hiệu hóa JavaScript trong trình duyệt của bạn và bằng cách tải lại trang.

Tôi hiểu rằng những hình ảnh đơn lẻ đó có thể được làm từ MMA. Một số câu trả lời cho thấy đúng hướng như thế nào người ta có thể làm điều đó. Vì vậy, tôi chấp nhận câu trả lời tốt nhất cho đến nay.

+4

Hầu hết các yếu tố có thể được tìm thấy dễ dàng trong Mathematica. Bạn có thể có 'Arrow', ví dụ dựa trên 'BezierCurve's hoặc' BSplineCurve's. Các tên có thể nhấp có thể được thực hiện dưới dạng 'Nút' với' Giao diện -> "Không khung". Phần còn lại chỉ là công việc. Có lẽ độ dày biến của mũi tên trong đồ họa có thể khó tái tạo. Có thể cần thiết để hạn chế sử dụng 'Arrow' và xây dựng chúng từ các bản vẽ cơ bản hơn. Bạn đã thử gì trước khi hỏi câu hỏi này? –

+0

@ SjoerdC.deVries Tôi đã không cố gắng cho đến nay. Bây giờ chỉ cần đọc tin tức trên BBC và nghĩ rằng nó sẽ là một vấn đề tốt cho một bài học thực hành MMA. Tôi sẽ cố gắng làm điều đó nhưng muốn những người khác có một cái nhìn quá. Đặc biệt những người gtting chán vào một buổi sáng thứ bảy sương mù. – PlatoManiac

+1

Tôi nghĩ rằng trong khi điều này đòi hỏi rất nhiều công việc, nó không phải là một nhiệm vụ quá khó khăn. Bạn sẽ cần phải bọc các đối tượng đồ họa trong 'EventHandler', làm cho các nhấp chuột sửa đổi một số biến, và đặt toàn bộ' Graphics' trong 'Dynamic' để nó cập nhật khi những vars thay đổi. 'HighlightGraph' là tốt cho một giải pháp đơn giản.Tạo một đồ thị được chỉ dẫn 'g' rồi thực hiện' SetterBar [Động [màu], {Đỏ, Lục, Xanh}] ',' Động @ Ảnh nổi bật [g, {Kiểu [1 \ [Chỉnh sửa] 2, màu]}] ' – Szabolcs

Trả lời

3

Chỉ cần một khởi động:

a = Point[{0, 0}]; 
b = .75 Tuples[{1, -1}, 2][[{3, 1, 2, 4}]]; 
PieChart[ 
{ 
    Button[1, (a = {Thickness[.05], Arrowheads[.1], 
     Arrow[[email protected]{b[[1]], {0, 0}, #}] & /@ b})], 
    Button[1, (a = {Thickness[.05], Arrowheads[.1], 
     Arrow[[email protected]{b[[2]], {0, 0}, #}] & /@ b})], 
    Button[1, (a = {Thickness[.05], Arrowheads[.1], 
     Arrow[[email protected]{b[[3]], {0, 0}, #}] & /@ b})], 
    Button[1, (a = {Thickness[.05], Arrowheads[.1], 
     Arrow[[email protected]{b[[4]], {0, 0}, #}] & /@ b})], 
    } 
, 
SectorOrigin -> {Automatic, 1}, 
Epilog -> [email protected]] 

enter image description here

Sửa More nhỏ gọn:

a = Point[{0, 0}]; 
b = .75 Tuples[{1, -1}, 2][[{3, 1, 2, 4}]]; 
PieChart[ 
ReleaseHold[Replace[Table[ 
    List[1, 
    ReplaceAll[ 
     Hold[a = {Thickness[.05], Arrowheads[.1], 
     Arrow[[email protected]{k, {0, 0}, #}] & /@ b}], k -> i]], 
    {i, b}], List -> Button, {2}, Heads -> True]] 
, 
SectorOrigin -> {Automatic, 1}, 
Epilog -> [email protected]] 
+0

(Tôi muốn vẽ sơ đồ như thế này trong một thời gian ...) Vấn đề là, OP không thực sự đề cập đến độ rộng của mũi tên cong được cho là tương ứng với các luồng mà chúng đại diện. Các sơ đồ phức tạp hơn của kiểu này có các mũi tên cong đi theo cả hai cách --- hiển thị độ lớn luồng vào và ra từ tất cả các nguồn có thể. IMO, không có viên đạn bạc trong Mathematica ... Sẽ dễ dàng hơn nếu cố gắng, nếu có thể, hãy chỉ định một Line [] có thể thay đổi độ rộng thành hàm của cường độ In/out, có thể khác nhau ở cả hai đầu các ví dụ phức tạp hơn. – telefunkenvf14

+1

@tele Tôi nhận ra độ rộng của mũi tên biến, nhưng cũng có rất nhiều chi tiết nhỏ hơn và lớn hơn khác trong biểu đồ OP. Nó có thể đòi hỏi rất nhiều thời gian để giải quyết tất cả, và bên cạnh đó, nó là khá nhàm chán. Nhưng ... Tôi nghĩ rằng bạn có một câu hỏi hay để đăng ở đây ... một cái gì đó như: "Làm thế nào để tạo ra một mũi tên với chiều rộng parametrized dọc theo vòng cung của nó?" –

+1

Tôi có rất nhiều câu hỏi tôi muốn hỏi, nhưng thấy nó rất tẻ nhạt để đảm bảo giải thích chính xác những gì tôi đang cố gắng làm. Các vấn đề về thiết kế và tích hợp luôn luôn trong tâm trí của tôi, điều này rất nhiều để nhồi nhét vào một câu hỏi duy nhất, và dường như đẩy giới hạn của những gì SO được dự định. Tôi muốn có một cách có tổ chức (đối với người dùng MMA) để phối hợp giải quyết một số loại vấn đề 'lớn' này và làm việc với các công cụ nguồn mở cùng nhau. IMO, WRI sẽ thực sự cần phải tham gia bằng cách nào đó. Tôi cảm thấy thất vọng bởi những kiến ​​thức tường tận, không thể tiếp cận với chúng tôi ở bên ngoài. – telefunkenvf14

3

Đây không phải là câu trả lời đầy đủ, nhưng quá dài để nhận xét. Tôi khuyến khích tất cả mọi người để "ăn cắp" từ nó, và hoàn thành nó :-)

g = RandomGraph[{5, 12}, DirectedEdges -> True]; 

SetterBar[Dynamic[v], VertexList[g]] 

[email protected][ 
    g, {Style[Cases[EdgeList[g], v \[DirectedEdge] _], 
    Directive[Thick, Black]], Style[v, Red]}, 
    GraphLayout -> "CircularEmbedding", EdgeStyle -> [email protected], 
    VertexLabels -> "Name"] 

enter image description here

Bước tiếp theo là sử dụng VertexShapeFunction với các đối tượng được bọc trong EventHandler để thay thế SetterBar.

+1

Tôi không thích sự lung lay của các mũi tên trong đồ thị Đồ thị –

+0

@Sjoerd Điều đó cũng có thể được tùy chỉnh và 'GraphPlot' có một giá trị mặc định khác. Dù sao, đây chỉ là một điểm khởi đầu, không có ý định như một cái gì đó thậm chí gần với một giải pháp cuối cùng. Có lẽ người đó thậm chí sẽ không sử dụng đồ thị. Tôi chỉ đăng để giúp người khác bắt đầu dễ dàng hơn (nếu có ai muốn sử dụng điều này). – Szabolcs

+0

@ SjoerdC.deVries Cảm ơn bạn đã chỉnh sửa. – Szabolcs

4

Một số động tác chân cơ bản hơn cho việc này:

g[\[Alpha]_, \[Beta]_, color_] := Module[{t}, 
t = Graphics[{{Thickness[.03], Arrowheads[{.15}], color, 
    Arrow[ 
    BezierCurve[{{Cos[\[Alpha]], Sin[\[Alpha]]}, {0, 
     0}, {Cos[\[Beta]], Sin[\[Beta]]}}]]}}, 
PlotRange -> 1.5, ImageSize -> 512, Background -> None]; 
ImageCompose[Blur[t, 15], t] 
] 

one = Fold[ImageCompose, 
g[0, \[Pi]/3, Blue], {g[0, \[Pi]/2, Blue], g[0, \[Pi], Blue], 
g[0, 4 \[Pi]/3, Blue]}] 

two = Fold[ImageCompose, 
g[\[Pi]/3, 0, Yellow], {g[\[Pi]/3, \[Pi]/2, Yellow], 
g[\[Pi]/3, \[Pi], Yellow], g[\[Pi]/3, 4 \[Pi]/3, Yellow]}] 

DynamicModule[{pick = 1}, 
ClickPane[ 
    [email protected][pick == 1, one, two], 
    Function[{point}, If[First[point] < 256, pick = 1, pick = 2]]] 
] 

enter image description here

+0

Bóng đẹp! Xin chúc mừng 1000 điểm đầu tiên của bạn BTW –

+0

Cảm ơn bạn. Tôi tự hỏi nếu tất cả các nguyên thủy không nên có thêm chỉ thị dựng hình như thế này ({AbsoluteShadow [n], Mũi tên [pts]} –

+0

Đây cũng là một bóng đẹp hơn nhiều so với một "PlotLegends' hiện đang có. Nhưng có lẽ tốt hơn không thêm vì nó đã chậm như bây giờ (xem http://stackoverflow.com/questions/8189742/plotlegends-makes-manipulate-ing-graphs-slow-to-a-crawl/8189802#8189802). –

Các vấn đề liên quan