Wie steuere ich die Form meiner Pfeilspitzen? Das TikZ-Paket von LaTeX enthält eine Vielzahl vordefinierter Pfeilspitzenstile, von denen ich einige gerne mit Mathematica-Zahlen vergleichen möchte, die ich in ein LaTeX-Dokument importiere:
Der Standardpfeilspitzenstil von Mathematica kommt jedoch bei weitem nicht in die Nähe. Beispiel:
Graphics[{Thick, Arrow[{{0, 0}, {-50, 0}}]}]
ergibt
Frühere Versionen von Mathematica hatten Optionen zum Steuern der Pfeilspitzenform, aber diese scheinen in 8.0 verschwunden zu sein.
Wie kann ich die Form meiner Mathematica-Pfeilspitzen an die LaTeX TikZ-Pfeilspitzenstile anpassen?
Kommentare
- Außerdem werden die Pfeile von Mathematica ' mithilfe einer Logik, die ich verwenden kann, anders skaliert als die LaTeX-Pfeilspitzen ' nicht erkennen. Idealerweise möchte ich ' auch sicherstellen, dass meine Mathematica-Pfeile genauso skaliert werden wie LaTeX-Pfeile. Aber das ist vielleicht eine separate Frage.
- Haben Sie sich die Dokumentation von
Arrowheads
angesehen? - Ja, natürlich. Nichts dort hat mich nahe gebracht.
- @Heike: Das gibt nur ein Beispiel für eine benutzerdefinierte Pfeilspitze, aber nichts über vordefinierte Typen (obwohl
StreamPlot
eine Vielzahl von Miriaden hat integrierte Pfeilstile). - Siehe diese Frage – es wird gezeigt, wie benutzerdefinierte Formen definiert werden, und absolute Pfeilspitzengrößen festlegen.
Antwort
Hier ist eine Manipulate
um sich eine Arrow
zu entwerfen:
DynamicModule[{top, baseMid, rightBase, outerMidRight, innerMidRight}, Manipulate[ top = {0, 0}; baseMid = {1, 0} baseMid; rightBase = {1, -1} leftBase; outerMidRight = {1, -1} outerMidLeft; innerMidRight = {1, -1} innerMidLeft; h = Graphics[ { Opacity[0.5], FilledCurve[ { BSplineCurve[{baseMid, innerMidLeft, leftBase}], BSplineCurve[{leftBase, outerMidLeft, top}], BSplineCurve[{top, outerMidRight, rightBase}], BSplineCurve[{rightBase, innerMidRight, baseMid}] } ] } ], {{baseMid, {-2, 0}}, Locator}, {{innerMidLeft, {-2, 0.5}}, Locator}, {{leftBase, {-2, 1}}, Locator}, {{outerMidLeft, {-1, 1}}, Locator} ] ]
Es ist einfach, bei Bedarf weitere Kontrollpunkte hinzuzufügen.
Die Pfeilspitzengrafiken werden in die Variable h
eingefügt. Beachten Sie, dass es eine Opacity
-Funktion enthält, um die Kontrollpunkte besser sichtbar zu machen. Sie müssen dies entfernen, wenn Sie eine vollständig gesättigte Pfeilspitze haben möchten.
Einige Beispiele, die mit diesem Manipulate
generiert wurden, verwenden:
Graphics[ { Arrowheads[{{Automatic, 1, h /. Opacity[_] :> Sequence[]}}], Arrow /@ Table[{{0, 0}, {Sin[t], Cos[t]}}, {t, 0, 2 \[Pi] - 2 \[Pi]/20, 2 \[Pi]/20}] }, PlotRangePadding -> 0.2 ]
Der Code für die Pfeilspitzen befindet sich in h
. Kopieren Sie einfach die Grafiken oder die FullForm
, um sie für die spätere Verwendung zu speichern.
h /. Opacity[_] :> Sequence[] // FullForm (* ==> Graphics[{FilledCurve[{BSplineCurve[{{-0.496, 0.}, {-1., 0.48}, {-2,1}}], BSplineCurve[{{-2, 1}, {-0.548, 0.44999999999999996}, {0, 0}}], BSplineCurve[{{0, 0}, {-0.548, -0.44999999999999996}, {-2, -1}}], BSplineCurve[{{-2, -1}, {-1., -0.48}, {-0.496, 0.}}]}]} ] *)
BEARBEITEN
Ein weiterer Kontrollpunkt deckt die häufigsten Formen ab:
DynamicModule[{top, baseMid, outerMidRight, innerMidRight, innerBaseRight, outerBaseRight}, Manipulate[ top = {0, 0}; baseMid = {1, 0} baseMid; innerBaseRight = {1, -1} innerBaseLeft; outerBaseRight = {1, -1} outerBaseLeft; outerMidRight = {1, -1} outerMidLeft; innerMidRight = {1, -1} innerMidLeft; h = Graphics[ { Opacity[0.5], FilledCurve[ { BSplineCurve[{baseMid, innerMidLeft, innerBaseLeft}], Line[{innerBaseLeft, outerBaseLeft}], BSplineCurve[{outerBaseLeft, outerMidLeft, top}], BSplineCurve[{top, outerMidRight, outerBaseRight}], Line[{outerBaseRight, innerBaseRight}], BSplineCurve[{innerBaseRight, innerMidRight, baseMid}] } ] } ], {{baseMid, {-2, 0}}, Locator}, {{innerMidLeft, {-2, 0.5}}, Locator}, {{innerBaseLeft, {-2, 1}}, Locator}, {{outerBaseLeft, {-2, 1.1}}, Locator}, {{outerMidLeft, {-1, 1}}, Locator} ] ]
Kommentare
- Erstaunlich! Danke!
Antwort
Eine Quelle für Pfeilspitzenformen ist Graph
enthält eine Liste vordefinierter Pfeilspitzenformen, die Sie mit der Option EdgeShapeFunction
festlegen können. Sie können die Namen dieser Formen abrufen, indem Sie Folgendes tun:
arrowheadNames = GraphElementData["Edge"];
Leider sind diese Namen für sich genommen in Arrowheads
. Glücklicherweise gibt es eine Möglichkeit, die Graphics
-Spezifikationen dieser Pfeilspitzen zu extrahieren, indem eine Graph
in Graphics
Verwenden von Show
und Extrahieren der Anweisungen Arrowheads
:
headlist = Flatten[Cases[ Show[Graph[{1 <-> 2}, EdgeShapeFunction -> #]], Arrowheads[a_] :> Cases[a, b_GraphicsBox :> ToExpression[b], Infinity, 1], Infinity, 1] & /@ arrowheadNames]; GraphicsGrid[Partition[headlist, 5, 5, {1, 1}, ""], Frame -> All]
Sie können diese in Arrowheads
wie folgt verwenden:
grlist = Graphics[{Arrowheads[{{.3, 1, #}}], Arrow[{{0, 0}, {1, 1}}]}] & /@ headlist; GraphicsGrid[Partition[grlist, 5, 5, {1, 1}, ""], Frame -> All]
Kommentare
- Ich kann ' Dieser Code funktioniert nicht mehr.
- Wie hier in Mathematica 10.1 funktioniert dieser Code nicht mehr.
- Hierfür Um in Mathematica 10 zu arbeiten, ersetzen Sie die
GraphicsBox
durchGraphics
:headlist = Flatten[Cases[ Show[Graph[{1 \[DirectedEdge] 2}, EdgeShapeFunction -> #]], Arrowheads[a_] :> Cases[a, _Graphics, Infinity, 1], Infinity, 1] & /@ arrowheadNames];
- Es gibt eine falsche Eingabe. Die Headlist wird am Anfang mit einem kleinen l „Headlist“ am Ende mit einem Großbuchstaben L „HeadList“ geschrieben …
- I habe es behoben, @Phil.