Graph3D - ganti simpul dengan MoleculePlot3D
Bagaimana kita bisa mengganti simpul dalam grafik 3-dim dengan Graphics3Dobjek individu ?
Dalam kasus konkret saya, saya ingin memvisualisasikan jaringan kimia dan mengganti simpul dengan MoleculePlot3Drepresentasi masing-masing . Sebagai penggoda, itulah Grafik 3D saat ini yang sedang saya kerjakan. Anda mungkin bisa membayangkan aplikasi akhirnya :)
Saya menggunakan ide dari posting ini untuk mengatur koordinat.
Bola merah harus diganti dengan plot molekul 3-dim.
Pertimbangkan contoh minimal ini:
Graph3D[{"CO" \[DirectedEdge] "C", "CO" \[DirectedEdge] "O"}]
Menyiapkan MoleculePlot3Dinstance yang sesuai :
vert = AssociationThread[
{"CO", "C", "O"} -> {
MoleculePlot3D[Molecule[{Atom["[C]"], Atom["[O]"]}, {Bond[{1, 2}, "Double"]}]],
MoleculePlot3D[Molecule[{Atom["[C]"]}]],
MoleculePlot3D[Molecule[{Atom["[O]"]}]]}]
Namun, saya mengalami kesulitan untuk mengganti simpul secara Graph3Dterprogram. Saya berhasil memodifikasi Grafik 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"}]
Bagaimana saya bisa melakukan ini di Graph3D? Secara lengkap saya akan mengerjakan molekul-molekul berikut:
{"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"}
Molekul jadi tergolong kecil tanpa perlu melakukan penskalaan yang ekstrim di MoleculePlots.
Jawaban
Jawaban ini menghindari Insetsama sekali dan mengambil grafik primitif dari dalam ekspresi dari sistem MoleculePlot3D, dan oleh karena itu agak rapuh karena bisa rusak di versi mendatang yang menyusun kembali keluarannya MoleculePlot3D.
Pemeriksaan menunjukkan bahwa Graphics3D yang dikembalikan oleh MoleculePlot3D selalu berisi a GraphicsComplexdengan semua atom dan ikatannya. Jadi kita bisa menggunakannya GraphicsComplexdan membungkusnya GeometricTransformationuntuk membuat fungsi bentuk simpul
molVertex[mol_][coords_, vertex_, scale_] := Module[
{graphic = MoleculePlot3D @ mol, gc},
gc = Cases[graphic, _GraphicsComplex, Infinity];
GeometricTransformation[
gc,
TranslationTransform[coords] @* ScalingTransform[scale]
]
]
Berikut ini contohnya,
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
]