Paket zum Zeichnen von RDF-Graphen

Paket zum Zeichnen von RDF-Graphen

Gibt es ein Paket zum Zeichnen schöner RDF-Grafiken, wie das folgende (entnommen ausDort)?

Kann ein solches Diagramm (im gleichen Stil) in TikZ erstellt werden?

Bildbeschreibung hier eingeben

Antwort1

Als erstes würde ich mit der Definition des Stils beginnen, der die Eckpunkte darstellen kann. Im Wesentlichen benötigen wir:

  1. eine Ellipse;
  2. einige Größendefinitionen;
  3. Zeichnen Sie den Rand dicker und setzen Sie die Füllfarbe im Verhältnis zum Rand heller.
  4. den Text in Weiß erstellen;
  5. Vielleicht die Schriftgröße des Textes etwas verkleinern.

Die Stildefinition in TikZ kann wie folgt erfolgen \tikzset:

\tikzset{vertex style/.style={
    draw=#1,
    thick,
    fill=#1!70,
    text=white,
    ellipse,
    minimum width=2cm,
    minimum height=0.75cm,
    font=\small,
    outer sep=3pt, % the usage of this option will be clear later on
  },
}

Beachten Sie zwei Dinge: Dieser Stil erhält ein Argument, die Farbe, und setzt die Füllfarbe heller, indem er die Farbe mit Weiß mischt. Zweitens ellipseerfordert die Form die Bibliothek:

\usetikzlibrary{shapes.geometric}

Lassen Sie uns nun den ersten Scheitelpunkt erstellen. Ich würde mit „Righteous Kill“ beginnen, von dem die meisten Verbindungen ausgehen.

\documentclass[dvipsnames,png,border=10pt,tikz]{standalone}
\usepackage{tikz}
\usetikzlibrary{shapes.geometric} % required for the ellipse shape
\tikzset{vertex style/.style={
    draw=#1,
    thick,
    fill=#1!70,
    text=white,
    ellipse,
    minimum width=2cm,
    minimum height=0.75cm,
    font=\small,
    outer sep=3pt,
  },
}
\begin{document}
\begin{tikzpicture}
\node[vertex style=Turquoise] (Rk) {Righteous Kill};
\end{tikzpicture}
\end{document}

Vorsicht bei der Option dvipsnames: Es war notwendig, diese in den Klassenoptionen festzulegen, um einen möglichen option clashFehler beim Selbstladen von TikZ zu vermeiden xcolor.

Der Knoten verwendet den oben definierten Stil, indem seine Farbe (Definition im xcolorHandbuch), sein Name (Rk)und sein Text festgelegt werden {Righteous Kill}.

Das Ergebnis:

Bildbeschreibung hier eingeben

Ab sofort werde ich nie mehr die Präambel anzeigen, sondern nur noch den Bildcode.

Der zweite Schritt besteht darin, die anderen Knoten zu lokalisieren. Man könnte viele Möglichkeiten nutzen (mit GraphViz, mit dem objektorientierten Modul von PGF und mit dem Erstellen einer benutzerdefinierten Klasse - siehe:Zeichnen von Beziehungen zwischen Elementen einer Datenbank): hier verwende ich die positioningBibliothek von TikZ. Jeder Scheitelpunkt wird daher ausgehend von der Position anderer Scheitelpunkte lokalisiert, indem auf ihre Namen verwiesen wird.

Hinweis: Da jeder Knoten mit einem anderen verbunden werden muss, lautet die Syntax

\node[options] (a) {text a} ... edge[options] node[options]{text conn} (b);

verbindet die Eckpunkte aund bsetzt ein Label für die Verbindung text conn. In diesem Fall äußerst nützlich. Beginnen wir also mit dem Hinzufügen eines weiteren Knotens:

\begin{tikzpicture}[node distance=2.75cm,>=stealth']
\node[vertex style=Turquoise] (Rk) {Righteous Kill};

\node[vertex style=BurntOrange, above of=Rk,xshift=2em] (BD) {Bryan Dennehy}
 edge [<-,cyan!60!blue] node[text style,above]{starring} (Rk);
\end{tikzpicture}

Die Optionen node distance=2.75cm,>=stealth'betreffen den Basis-Scheitelpunktabstand und den Typ der Pfeilspitze, die für die Verbindung verwendet wird. Aufgrund der ausgewählten Pfeilspitze arrowssollte die Bibliothek geladen werden.

Beachten Sie, dass der Verbindungstext einen Stil erfordert: text style. Seine Definition lautet:

\tikzset{
  text style/.style={
    sloped, % the text will be parallel to the connection 
    text=black,
    font=\footnotesize,
    above
  }
}

Die Position des neuen Knotens wird über die Optionen festgelegt above of=Rk,xshift=2em: Die erste legt die Position im Verhältnis zum Namen des vorherigen Knotens fest, den wir zuvor erstellt haben, die zweite verschiebt diese Position etwas nach rechts.

Ergebnis:

Bildbeschreibung hier eingeben

Wenn dieser Mechanismus verstanden ist, ist es möglich, alle anderen Knoten zu lokalisieren:

\begin{tikzpicture}[node distance=2.75cm,>=stealth']
\node[vertex style=Turquoise] (Rk) {Righteous Kill};

\node[vertex style=BurntOrange, above of=Rk,xshift=2em] (BD) {Bryan Dennehy}
 edge [<-,cyan!60!blue] node[text style]{starring} (Rk);

\node[vertex style=BurntOrange, right=1.5cm of Rk,yshift=4ex] (AP) {Al Pacino}
 edge [<-,cyan!60!blue] node[text style]{starring} (Rk); 

\node[vertex style=red, below right of=Rk,xshift=2em] (JA) {John Avnet}
 edge [<-,cyan!60!blue] node[text style]{director} (Rk); 

 \node[vertex style=BurntOrange, right=1.5cm of Rk,yshift=-4ex] (RN) {Robert De Niro}
 edge [<-,cyan!60!blue] node[text style]{starring} (Rk); 

\node[vertex style=MidnightBlue, above right of=Rk,xshift=2em] (Dr) {Drama}
 edge [<-,cyan!60!blue] node[text style]{genre} (Rk); 

\node[vertex style=Maroon, below of=Rk,xshift=-2em] (Skf) {Serial Killer Films}
 edge [<-,cyan!60!blue] node[text style]{subject} (Rk);

\node[vertex style=Maroon, below right of=Skf] (Cf) {Crime Films}
 edge [<-,cyan!60!blue] node[text style]{broader} (Skf);
\end{tikzpicture}

Bildbeschreibung hier eingeben

Sobald diese Aufgabe erledigt ist, können Sie mit dem Hinzufügen des „flüssigen“ Hintergrunds um einige Eckpunkte herum beginnen.

Um etwas im Hintergrund zu platzieren, backgroundsist die Bibliothek hilfreich, ebenso wie die hobbyBibliothek von Andrew Stacey zum Zeichnen der glatten Kurve. Darüber hinaus sind oft einige Berechnungen erforderlich, daher calcsollte auch die Bibliothek geladen werden.

Die Pfaddefinition sollte folgendermaßen erfolgen: Ausgehend vom Norden des Knotens (Rk)umrundet man alle möglichen Ankerpunkte der interessierenden Knoten, die hervorgehoben werden sollen. Es gibt einige automatische Tools, sieheHobby-Pfadrealisierung im konvexen Hüllenansatz, aber sie können nicht so präzise sein und Dinge fein abstimmen wie manche Handarbeit. Und in diesem Fall ermöglicht dies, ein optimales Ergebnis zu erzielen.

\begin{pgfonlayer}{background}
\draw[Maroon,fill=Maroon,dashed,fill opacity=0.1](Rk.north) 
to[closed,curve through={(Rk.north west).. (Rk.west) .. (Rk.south west) 
..($(Rk.south west)!0.5!(Skf.north)$) .. (Skf.north     west).. (Skf.west) 
.. (Skf.south west) .. ($(Skf.south)!0.75!(Cf.west)$) .. (Cf.west) 
.. (Cf.south west) .. (Cf.south) .. (Cf.south east) .. (Cf.east) 
.. ($(Cf.north east)!0.65!(Skf.south east)$) .. (Skf.east) 
.. (Skf.north east).. ($(Skf.north)!0.35!(Rk.south east)$) 
.. (Rk.south east) .. (Rk.east)..(Rk.north east)}](Rk.north);
\end{pgfonlayer}

Das ist mehr oder weniger der Code … aber das ist das Ergebnis:

Bildbeschreibung hier eingeben

Die mysteriöse Option outer sep=3ptsorgt dafür, dass der „flüssige Hintergrund“ nicht zu nahe an der Rahmenform liegt. Und das ist alles!

Der vollständige Code zur Referenz:

\documentclass[dvipsnames,png,border=10pt,tikz]{standalone}
\usepackage{tikz}
\usetikzlibrary{shapes.geometric} % required for the ellipse shape
\usetikzlibrary{arrows, backgrounds, calc, hobby, positioning}

% this avoides some problem with the hobby implementation
% egreg's code from:
% http://www.guitex.org/home/it/forum/5-tex-e-latex/83195-la-libreria-hobby-tikz-non-funziona-piu#83203
\ExplSyntaxOn
\cs_if_exist:NF \prg_stepwise_function:nnnN { \cs_gset_eq:NN \prg_stepwise_function:nnnN \int_step_function:nnnN }
\cs_if_exist:NF \prg_stepwise_inline:nnnn { \cs_gset_eq:NN \prg_stepwise_inline:nnnn \int_step_inline:nnnn }
\ExplSyntaxOff

\tikzset{vertex style/.style={
    draw=#1,
    thick,
    fill=#1!70,
    text=white,
    ellipse,
    minimum width=2cm,
    minimum height=0.75cm,
    font=\small,
    outer sep=3pt,
  },
  text style/.style={
    sloped,
    text=black,
    font=\footnotesize,
    above
  }
}

\begin{document}
\begin{tikzpicture}[node distance=2.75cm,>=stealth']
\node[vertex style=Turquoise] (Rk) {Righteous Kill};

\node[vertex style=BurntOrange, above of=Rk,xshift=2em] (BD) {Bryan Dennehy}
 edge [<-,cyan!60!blue] node[text style]{starring} (Rk);

\node[vertex style=BurntOrange, right=1.5cm of Rk,yshift=4ex] (AP) {Al Pacino}
 edge [<-,cyan!60!blue] node[text style]{starring} (Rk); 

\node[vertex style=red, below right of=Rk,xshift=2em] (JA) {John Avnet}
 edge [<-,cyan!60!blue] node[text style]{director} (Rk); 

 \node[vertex style=BurntOrange, right=1.5cm of Rk,yshift=-4ex] (RN) {Robert De Niro}
 edge [<-,cyan!60!blue] node[text style]{starring} (Rk); 

\node[vertex style=MidnightBlue, above right of=Rk,xshift=2em] (Dr) {Drama}
 edge [<-,cyan!60!blue] node[text style]{genre} (Rk); 

\node[vertex style=Maroon, below of=Rk,xshift=-2em] (Skf) {Serial Killer Films}
 edge [<-,cyan!60!blue] node[text style]{subject} (Rk);

\node[vertex style=Maroon, below right of=Skf] (Cf) {Crime Films}
 edge [<-,cyan!60!blue] node[text style]{broader} (Skf);

\begin{pgfonlayer}{background}
\draw[Maroon,fill=Maroon,dashed,fill opacity=0.1](Rk.north) 
to[closed,curve through={(Rk.north west).. (Rk.west) .. (Rk.south west) 
..($(Rk.south west)!0.5!(Skf.north)$) .. (Skf.north     west).. (Skf.west) 
.. (Skf.south west) .. ($(Skf.south)!0.75!(Cf.west)$) .. (Cf.west) 
.. (Cf.south west) .. (Cf.south) .. (Cf.south east) .. (Cf.east) 
.. ($(Cf.north east)!0.65!(Skf.south east)$) .. (Skf.east) 
.. (Skf.north east).. ($(Skf.north)!0.35!(Rk.south east)$) 
.. (Rk.south east) .. (Rk.east)..(Rk.north east)}](Rk.north);
\end{pgfonlayer}

\end{tikzpicture}
\end{document}

verwandte Informationen