Paquete para dibujar gráficos RDF

Paquete para dibujar gráficos RDF

¿Existe algún paquete para dibujar bonitos gráficos RDF, como el siguiente (tomado deallá)?

¿Se puede producir un gráfico de este tipo (con el mismo estilo) en TikZ?

ingrese la descripción de la imagen aquí

Respuesta1

Como primera idea empezaría por definir el estilo capaz de representar los vértices; básicamente necesitamos:

  1. una elipse;
  2. algunas definiciones de tamaño;
  3. dibujar el borde más grueso y establecer el color de relleno más brillante con respecto al borde;
  4. hacer el texto en color blanco;
  5. Quizás reduzca un poco el tamaño de la fuente del texto.

La definición de estilo en TikZ se puede realizar mediante \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
  },
}

Observe dos cosas: este estilo recibe un argumento, el color, y establece el color de relleno más brillante mezclando el color con blanco. En segundo lugar, la ellipseforma requiere la biblioteca:

\usetikzlibrary{shapes.geometric}

Creemos ahora el primer vértice. Comenzaría con "Righteous Kill", del que parten la mayoría de las conexiones.

\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}

Cuidado con la opción dvipsnames: ha sido necesario configurarla dentro de las opciones de clase para evitar un posible option clasherror ya que TikZ se carga solo xcolor.

El nodo utiliza el estilo definido anteriormente estableciendo su color (definición en el xcolormanual), su nombre (Rk)y su texto {Righteous Kill}.

El resultado:

ingrese la descripción de la imagen aquí

De ahora en adelante, no mostraré en ningún momento el preámbulo, sino sólo el código de la imagen.

El segundo paso es localizar los otros nodos. Se podrían aprovechar muchas posibilidades (usando GraphViz, usando el módulo orientado a objetos de PGF y creando alguna clase personalizada; consulte:Dibujar relaciones entre elementos de una base de datos.): aquí uso la positioningbiblioteca de TikZ. Cada vértice, por tanto, se localizará partiendo de la posición de otros vértices haciendo referencia a sus nombres.

Aviso: dado que cada vértice necesita estar conectado a otro, la sintaxis

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

conectará los vértices ay bestablecerá una etiqueta para la conexión text conn. Extremadamente útil en este caso. De hecho, comencemos a agregar otro nodo:

\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}

Las opciones node distance=2.75cm,>=stealth'se refieren a la distancia básica del vértice y al tipo de punta de flecha utilizada para la conexión. Debido a la punta de la flecha seleccionada, la biblioteca arrowsdebería cargarse.

Observe que el texto de conexión requiere un estilo: text style. Su definición es:

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

La ubicación del nuevo nodo se realiza a través de las opciones above of=Rk,xshift=2em: la primera establece la posición en relación con el nombre del nodo anterior que creamos antes, la segunda desplaza un poco a la derecha esta posición.

Resultado:

ingrese la descripción de la imagen aquí

Una vez comprendido este mecanismo, es posible localizar todos los demás nodos:

\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}

ingrese la descripción de la imagen aquí

Una vez realizada esta tarea, es posible comenzar a agregar el fondo "líquido" alrededor de algunos vértices.

Para colocar algo de fondo la biblioteca backgroundses de ayuda, así como la hobbybiblioteca de Andrew Stacey para dibujar la curva suave. Además, a menudo se necesitan algunos cálculos, por lo que también calcse debe cargar la biblioteca.

La definición de la ruta debe realizarse de la siguiente manera: comenzando desde el norte del nodo (Rk), se circunnavegan todos los anclajes posibles de los nodos interesados ​​a resaltar. Hay algunas herramientas automáticas, verRealización de un recorrido de hobby en un enfoque de casco convexo, pero no pueden ser precisos y afinar las cosas como lo puede hacer algún trabajo manual. Y, en este caso, esto permite lograr el mejor resultado.

\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}

Más o menos ese es el código... pero ese es el resultado:

ingrese la descripción de la imagen aquí

La opción misteriosa outer sep=3ptpermite que el "fondo líquido" no se acerque demasiado a la forma del borde. ¡Y ahora es todo!

El código completo como referencia:

\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}

información relacionada