Graph3D - köşeleri MoleculePlot3D ile değiştirin

Aug 24 2020

3 boyutlu bir grafikteki köşeleri tek tek Graphics3Dnesnelerle nasıl değiştirebiliriz ?

Somut durumumda, bir kimyasal ağı görselleştirmek ve köşeleri ilgili MoleculePlot3Dtemsilleriyle değiştirmek istiyorum . Bir teaser olarak, üzerinde çalıştığım şu anki 3D Grafik bu. Muhtemelen son uygulamayı hayal edebilirsiniz :)

Koordinatları oluşturmak için bu yazıdaki fikirleri kullandım .

Kırmızı Küreler, 3 boyutlu molekül grafikleri ile değiştirilmelidir.

Şu minimal örneği düşünün:

Graph3D[{"CO" \[DirectedEdge] "C", "CO" \[DirectedEdge] "O"}]

Karşılık gelen MoleculePlot3Dörnekleri kurma :

vert = AssociationThread[
  {"CO", "C", "O"} -> {
   MoleculePlot3D[Molecule[{Atom["[C]"], Atom["[O]"]}, {Bond[{1, 2}, "Double"]}]], 
   MoleculePlot3D[Molecule[{Atom["[C]"]}]], 
   MoleculePlot3D[Molecule[{Atom["[O]"]}]]}]

Bununla birlikte, Graph3Dprogramatik olarak köşeleri değiştirmekte zorluk çekiyorum . 2D Grafiği değiştirmeyi başardım:

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"}]

Bunu Graph3D'de nasıl yapabilirim? Tam olarak şu moleküllerle çalışacağım:

{"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"}

Bu nedenle, Molekül Grafiklerinde aşırı ölçeklendirme yapmaya gerek kalmadan nispeten küçük moleküller.

Yanıtlar

2 JasonB. Aug 25 2020 at 02:35

Bu cevap Insettamamen kaçınır ve grafik ilkellerini bir sistemden ifadenin içinden alır MoleculePlot3Dve bu nedenle biraz kırılgandır çünkü çıktıyı yeniden yapılandıran gelecekteki bir sürümde kırılabilir MoleculePlot3D.

İnceleme, MoleculePlot3D tarafından döndürülen Graphics3D'nin her zaman GraphicsComplextüm atomları ve bağları içeren a'yı içerdiğini gösterir . Böylece bunu kullanabiliriz GraphicsComplexve GeometricTransformationköşe şekli işlevini yapmak için onu sarabiliriz.

molVertex[mol_][coords_, vertex_, scale_] := Module[
    {graphic = MoleculePlot3D @ mol, gc},
    gc = Cases[graphic, _GraphicsComplex, Infinity];
    GeometricTransformation[
        gc, 
        TranslationTransform[coords] @* ScalingTransform[scale]
    ]
]

İşte bir örnek,

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
]