Graph3D - thay thế các đỉnh bằng MoleculePlot3D
Làm thế nào chúng ta có thể thay thế các đỉnh trong đồ thị 3 mờ bằng các Graphics3Dđối tượng riêng lẻ ?
Trong trường hợp cụ thể của tôi, tôi muốn hình dung một mạng lưới hóa học và thay thế các đỉnh bằng các MoleculePlot3Dbiểu diễn tương ứng của chúng . Như một đoạn giới thiệu, đó là Đồ thị 3D hiện tại mà tôi đang làm việc. Bạn có thể hình dung ứng dụng cuối cùng :)
Tôi đã sử dụng các ý tưởng từ bài đăng này để thiết lập các tọa độ.
Các ô màu đỏ nên được thay thế bằng ô phân tử 3 mờ.
Hãy xem xét ví dụ nhỏ nhất này:
Graph3D[{"CO" \[DirectedEdge] "C", "CO" \[DirectedEdge] "O"}]
Thiết lập các phiên bản tương ứng MoleculePlot3D:
vert = AssociationThread[
{"CO", "C", "O"} -> {
MoleculePlot3D[Molecule[{Atom["[C]"], Atom["[O]"]}, {Bond[{1, 2}, "Double"]}]],
MoleculePlot3D[Molecule[{Atom["[C]"]}]],
MoleculePlot3D[Molecule[{Atom["[O]"]}]]}]
Tuy nhiên, tôi gặp khó khăn khi thay thế các đỉnh trong Graph3Dchương trình. Tôi đã quản lý để sửa đổi Đồ thị 2D:
Graph[{
Annotation["CO", VertexShapeFunction -> (Inset[vert["CO"], #1, Center, 2*#3] &), VertexSize -> 0.2],
Annotation["C", VertexShapeFunction -> (Inset[vert["C"], #1, Center, 2*#3] &), VertexSize -> 0.2],
Annotation["O", VertexShapeFunction -> (Inset[vert["O"], #1, Center, 2*#3] &), VertexSize -> 0.2]},
{"CO" \[DirectedEdge] "C", "CO" \[DirectedEdge] "O"}]
Làm cách nào để thực hiện việc này trong Graph3D? Trong trường hợp đầy đủ, tôi sẽ làm việc với các phân tử sau:
{"C", "C+", "CH", "CH+", "CN", "CO", "CS", "CS+", "H", "H2", "HCO+",
"HCS+", "He", "N", "O", "OH", "S", "SO", "CH2+", "CO+", "O+", "OCS+",
"S+", "SO+", "CH2", "CN+", "H2O", "HCN", "HS", "H3O+", "HS+", "CH3+",
"HNC", "H3CO+", "CH4", "N+", "N2", "H+", "OH+", "OCS", "H2O+", "H2+",
"H2S+", "H3+", "He+", "O2", "SO2"}
Vì vậy, các phân tử tương đối nhỏ mà không cần phải tăng tỷ lệ cực lớn trong MoleculePlots.
Trả lời
Câu trả lời này tránh Insethoàn toàn và lấy các nguyên thủy đồ họa từ bên trong biểu thức từ một hệ thống MoleculePlot3D, và do đó hơi mong manh vì nó có thể bị hỏng trong phiên bản tương lai cấu trúc lại đầu ra từ đó MoleculePlot3D.
Kiểm tra cho thấy rằng Graphics3D do MoleculePlot3D trả về luôn chứa a GraphicsComplexvới tất cả các nguyên tử và liên kết. Vì vậy, chúng ta có thể sử dụng nó GraphicsComplexvà quấn nó vào GeometricTransformationđể tạo ra hàm hình dạng đỉnh
molVertex[mol_][coords_, vertex_, scale_] := Module[
{graphic = MoleculePlot3D @ mol, gc},
gc = Cases[graphic, _GraphicsComplex, Infinity];
GeometricTransformation[
gc,
TranslationTransform[coords] @* ScalingTransform[scale]
]
]
Đây là một ví dụ,
SeedRandom @ 42;
g = RandomGraph @ {5, 8};
mols = Map[
Molecule,
{"CCCC(C)(C)OCC", "SC1CCCC1", "O=P(O)(O)CCO", "CCCC", "F[Ti](Cl)(Cl)Cl"}
];
Graph3D[
Annotation[#,
VertexShapeFunction -> molVertex[mols[[#]]],
VertexSize -> 0.2
]& /@ VertexList[g],
EdgeList @ g
]