Git Product home page Git Product logo

tikz-network's Introduction

tikz-network

A tool to visualize complex networks in LaTeX.

Package: tikz-network
Date: 15 August 2019
Authors: Jürgen Hackl
Contact: [email protected]
Web site: https://github.com/hackl/tikz-network/
Documentation: manual
Copyright: This document has been placed in the public domain.
License: GNU General Public Licence.
Version: 1.1

Purpose

In recent years, complex network theory becomes more and more popular within the scientific community. Besides a solid mathematical base on which these theories are built on, a visual representation of the networks allow communicating complex relationships to a broad audience.

Nowadays, a variety of great visualization tools are available, which helps to structure, filter, manipulate and of course to visualize the networks. However, they come with some limitations, including the need for specific software tools, difficulties to embed the outputs properly in a LaTeX file (e.g. font type, font size, additional equations and math symbols needed,...) and challenges in the post-processing of the graphs, without rerunning the software tools again.

In order to overcome this issues, the package tikz-network was created. Some of the features are:

  • LaTeX is a standard for scientific publications and widely used
  • beside LaTeX no other software is needed
  • no programming skills are needed
  • simple to use but allows 100% control over the output
  • easy for post-processing (e.g. adding drawings, texts, equations,\dots)
  • same fonts, font sizes, mathematical symbols, \dots as in the document
  • no quality loss of the output due to the pdf format
  • networks are easy to adapt or modify for lectures or small examples
  • able to visualize larger networks
  • three-dimensional visualization of (multilayer) networks
  • compatible with other visualization tools

ToDo

Code to fix

  • change default entries for Boolean options in the vertices file.

Documentation

  • add indices to the manual.
  • add an extended tutorial/example to the document.
  • clean-up and document the .sty file.

Features

  • add a spherical coordinate system

Add-ons

  • add QGIS to tikz-network compiler

Changelog

Version Changes
0.1 initial commit
0.2 changed the package name to tikz-network
0.3 added commands \Text and \Plain, plus smaller changes in the commands \Vertex and \Edge
0.4 renamed \Plain to \Plane and added commands to change the label font, size and color
0.5 added a description of the Python module network2tikz
1.0 upload to the CTAN server
1.1 fixed csv input and added manual examples as standalone figures to git

tikz-network's People

Contributors

ghschaden avatar hackl avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

tikz-network's Issues

Negative interaction sign for directed edges

Hello!
Thanks for putting this great work together!
I would have one feature request in order to make your package suitable for my needs: I'm trying to draw a network where interactions are directed and can be either positive or negative which I would like to be able show graphically (showing positive interaction with a arrow head, and negative one with a dash, see here for example). Would it be possible to add this feature?
Thanks!

Colorbar based on line width or color

Is it possible to create a color bar, that tells the range of line width values? Similarly, it would be nice to have an option that outputs colorbar based on the intensity of colors. These will be important features for creating network-based heatmaps.

\begin{tikzpicture}
\Vertices{data/vertices.csv}
\Edges[Direct]{data/edges.csv}
\end{tikzpicture}

Node label colour

When I create nodes with the \node command I can change the label colour, e.g. with
\node at (0,0)[font=\footnotesize,orange]{\textbf{A}};

Is there any way to achieve this when I import node information from a .csv file through the \Vertices command?

Edge path incompatible with arrows

When using a path= in edge specifications, issues occur in styling the arrow head, both using style= or Direct. MWE and screenshot below.

Perhaps this can be noted in the documentation.

\documentclass{standalone}
\usepackage{tikz-network}
\begin{document}

\begin{tikzpicture}
\Vertex[x=-2, y=1]{z1}
\Vertex[x=-1, y=0]{z2}

\Edge[style={-{latex}}, path={z1, {1, 1}, z2}](z1)(z2)
\end{tikzpicture}

\begin{tikzpicture}
\Vertex[x=-2, y=1]{z1}
\Vertex[x=-1, y=0]{z2}

\Edge[Direct, path={z1, {1, 1}, z2}](z1)(z2)
\end{tikzpicture}

\end{document}

image

Text provided by keyword label is not searchable when using multilayer = 3d

Suggestion:

I have no idea what the cause is and also what the solution would be but I ask that when using multilayer = 3d I the text provided by the "label" option can be searchable. Because only when drawing using multilayer = 3d I can't make the vertex label searchable.
From the section "B.1.4 Simple example" extracted from the tikz-network manual according to the code below, the search works normally:

\documentclass{standalone}
\usepackage{tikz-network}
\begin{document}
\begin{tikzpicture}
\clip (0,0) rectangle (8.0,8.0);
\Vertex[x=2.868,y=5.518,size=0.5,color=red,opacity=0.7,label=Alice,position=below]{a}
\Vertex[x=1.000,y=7.000,size=0.5,color=blue,opacity=0.7,label=Bob,position=below]{b}
\Vertex[x=5.006,y=5.387,size=0.5,color=red,opacity=0.7,label=Claire,position=below]{c}
\Vertex[x=6.858,y=3.552,size=0.5,color=blue,opacity=0.7,label=Dennis,position=below]{d}
\Vertex[x=7.000,y=6.419,size=0.5,color=red,opacity=0.7,label=Esther,position=below]{e}
\Vertex[x=3.698,y=2.808,size=0.5,color=blue,opacity=0.7,label=Frank,position=below]{f}
\Vertex[x=5.551,y=1.000,size=0.5,color=blue,opacity=0.7,label=George,position=below]{g}
\Edge[,lw=1.0,bend=-8.531,Direct](a)(b)
\Edge[,lw=1.0,bend=-8.531,Direct](a)(c)
\Edge[,lw=3.0,bend=-8.531,Direct](c)(d)
\Edge[,lw=3.0,bend=-8.531,Direct](d)(e)
\Edge[,lw=3.0,bend=-8.531,Direct](e)(c)
\Edge[,lw=1.0,bend=-8.531,Direct](c)(f)
\Edge[,lw=3.0,bend=-8.531,Direct](f)(a)
\Edge[,lw=1.0,bend=-8.531,Direct](f)(g)
\Edge[,lw=1.0,bend=-8.531,Direct](g)(g)
\Edge[,lw=1.0,bend=-8.531,Direct](g)(d)
\end{tikzpicture}
\end{document}

Edge labels along edge

Greetings :)

I got the following graph:

\documentclass{standalone}
\usepackage{tikz}
\usepackage{tikz-network}

\begin{document}
\begin{tikzpicture}
    \clip (0,0) rectangle (30.0,30.0);
    \Vertex[x=29.000,y=15.000,size=2.0,color={0,77,153},opacity=0.7,label=A0,fontcolor={230,230,230},fontscale=2.286,RGB]{A0}
    \Vertex[x=22.000,y=27.124,size=2.0,color={0,77,153},opacity=0.7,label=A4,fontcolor={230,230,230},fontscale=2.286,RGB]{A4}
    \Vertex[x=8.000,y=27.124,size=2.0,color={0,77,153},opacity=0.7,label=A3,fontcolor={230,230,230},fontscale=2.286,RGB]{A3}
    \Vertex[x=1.000,y=15.000,size=2.0,color={0,77,153},opacity=0.7,label=A1,fontcolor={230,230,230},fontscale=2.286,RGB]{A1}
    \Vertex[x=8.000,y=2.876,size=2.0,color={0,77,153},opacity=0.7,label=A5,fontcolor={230,230,230},fontscale=2.286,RGB]{A5}
    \Vertex[x=22.000,y=2.876,size=2.0,color={0,77,153},opacity=0.7,label=A2,fontcolor={230,230,230},fontscale=2.286,RGB]{A2}
    \Edge[,lw=3.6871,color=purple,opacity=0.4687143150544264,bend=-8.531,label=11968.5/32460.0: 0.37,Direct](A0)(A4)
    \Edge[,lw=3.2066,color=purple,opacity=0.4206628671185051,bend=-8.531,label=10408.7/32460.0: 0.32,Direct](A0)(A3)
    \Edge[,lw=6.0346,color=purple,opacity=0.7034586157321837,bend=-8.531,label=19588.3/32460.0: 0.60,Direct](A0)(A1)
    \Edge[,lw=1.2568,color=purple,opacity=0.22568186485931396,bend=-8.531,label=4079.6/32460.0: 0.13,Direct](A0)(A5)
    \Edge[,lw=1.5525,color=purple,opacity=0.25524799753542815,bend=-8.531,label=5039.3/32460.0: 0.16,Direct](A0)(A2)
    \Edge[,lw=2.9291,color=purple,opacity=0.39291401533692316,bend=-8.531,label=11968.5/40860.0: 0.29,Direct](A4)(A0)
    \Edge[,lw=3.6119,color=purple,opacity=0.4611890194158921,bend=-8.531,label=14758.2/40860.0: 0.36,Direct](A4)(A3)
    \Edge[,lw=6.6366,color=purple,opacity=0.763656387665199,bend=-8.531,label=27117.0/40860.0: 0.66,Direct](A4)(A1)
    \Edge[,lw=1.9087,color=purple,opacity=0.29087045194974714,bend=-8.531,label=7799.0/40860.0: 0.19,Direct](A4)(A2)
    \Edge[,lw=3.4455,color=purple,opacity=0.44454540439148216,bend=-8.531,label=10408.7/30210.0: 0.34,Direct](A3)(A0)
    \Edge[,lw=4.8852,color=purple,opacity=0.5885198058038182,bend=-8.531,label=14758.2/30210.0: 0.49,Direct](A3)(A4)
    \Edge[,lw=7.1194,color=purple,opacity=0.8119392033542985,bend=-8.531,label=21507.7/30210.0: 0.71,Direct](A3)(A1)
    \Edge[,lw=1.132,color=purple,opacity=0.21319651329581812,bend=-8.531,label=3419.7/30210.0: 0.11,Direct](A3)(A5)
    \Edge[,lw=2.522,color=purple,opacity=0.3522029129427343,bend=-8.531,label=7619.1/30210.0: 0.25,Direct](A3)(A2)
    \Edge[,lw=2.9965,color=purple,opacity=0.3996522359900059,bend=-8.531,label=19588.3/65370.0: 0.30,Direct](A1)(A0)
    \Edge[,lw=4.1482,color=purple,opacity=0.5148233134465356,bend=-8.531,label=27117.0/65370.0: 0.41,Direct](A1)(A4)
    \Edge[,lw=3.2901,color=purple,opacity=0.4290145836520324,bend=-8.531,label=21507.7/65370.0: 0.33,Direct](A1)(A3)
    \Edge[,lw=1.9365,color=purple,opacity=0.29364514813115106,bend=-8.531,label=12658.6/65370.0: 0.19,Direct](A1)(A2)
    \Edge[,lw=4.945,color=purple,opacity=0.5945010101010099,bend=-8.531,label=4079.6/8250.0: 0.49,Direct](A5)(A0)
    \Edge[,lw=4.145,color=purple,opacity=0.5145010101010101,bend=-8.531,label=3419.6/8250.0: 0.41,Direct](A5)(A4)
    \Edge[,lw=4.1451,color=purple,opacity=0.5145050505050504,bend=-8.531,label=3419.7/8250.0: 0.41,Direct](A5)(A3)
    \Edge[,lw=6.6902,color=purple,opacity=0.7690242424242423,bend=-8.531,label=5519.4/8250.0: 0.67,Direct](A5)(A1)
    \Edge[,lw=2.7269,color=purple,opacity=0.3726929292929293,bend=-8.531,label=2249.7/8250.0: 0.27,Direct](A5)(A2)
    \Edge[,lw=2.3138,color=purple,opacity=0.33137511478420556,bend=-8.531,label=5039.3/21780.0: 0.23,Direct](A2)(A0)
    \Edge[,lw=3.5808,color=purple,opacity=0.45807927762473233,bend=-8.531,label=7799.0/21780.0: 0.36,Direct](A2)(A4)
    \Edge[,lw=3.4982,color=purple,opacity=0.4498186409550048,bend=-8.531,label=7619.1/21780.0: 0.35,Direct](A2)(A3)
    \Edge[,lw=5.812,color=purple,opacity=0.6812021732476283,bend=-8.531,label=12658.6/21780.0: 0.58,Direct](A2)(A1)
    \Edge[,lw=1.0329,color=purple,opacity=0.20329277624732173,bend=-8.531,label=2249.7/21780.0: 0.10,Direct](A2)(A5)
    \end{tikzpicture}   
\end{document}

PDF: test2.pdf

How can I achieve that the edge labels are (1) always along the edges and (2) manipulate the size of the white circle around the edge labels?

Similar to this graph: text.pdf

Label disappears if RGB setting is omitted in edges.csv

I tried to omit the use of RGB in vertices.csv and edges.csv and I don't know if the label "C" was not shown to be related to this omission.

image

My MWE following first page example 27 from manual tikz-network.

\documentclass{article}
\usepackage{tikz-network}
\thispagestyle{empty}
\begin{document}
\begin{tikzpicture}
\Vertices{data/vertices.csv}
\Edges{data/edges.csv}
\end{tikzpicture}
\end{document}

My new settings in edges.csv omitting RGB settings

u,v,label,lw,color ,opacity,bend
A,B, ab  ,.5,red   ,   1   ,  30
B,C, bc  ,.7,blue  ,   1   , -60
B,D, bd  ,.5,blue  ,  .5   , -60
A,E, ae  , 1,green ,   1   ,  75
C,E, ce  , 2,orange,   1   ,   0
A,A, aa  ,.3,black ,  .5   ,  75

My new settings in vertices.csv omitting RGB settings


id, x, y ,size, color,opacity,label,IdAsLabel,NoLabel
 A, 0,  0, .4 , green,  .9   ,  a  ,  false  , false
 B, 1, .7, .6 ,      ,  .5   ,  b  ,  false  , false
 C, 2,  1, .8 ,orange,  .3   ,  c  ,  false  , true
 D, 2,  0, .5 ,   red,  .7   ,  d  ,  true   , false
 E,.2,1.5, .5 ,  gray,       ,  e  ,  false  , false

Several \Vertices commands in one document produce erratical behaviour

When using several \Vertices commands in the same document wrong input files are used.

MWE:

\documentclass{article}
\usepackage{tikz-network}
\begin{document}
\begin{tikzpicture}
 \Vertices{cci14.txt}
\end{tikzpicture}


\begin{tikzpicture}
 \Vertices{cci23.txt}
\end{tikzpicture}

\begin{tikzpicture}
 \Vertices{cci14.txt}
\end{tikzpicture}

\begin{tikzpicture}
 \Vertices{cci23.txt}
\end{tikzpicture}
\end{document}

This yields different output for the first and third input, which are identical.

Feature request: forgiving an empty line in *.csv file

I am doing some modeling works, and would like to organize a set of edges into "chunks". As the *.csv format is super helpful when combined with Excel as a Viewer/Editor, I think it is a legitimate usage to leave one line blank in the edge list. This shall denote the start/end of a set of relevant edges. (Of course, I may as well use more labels to denote such set of edges.)

Currently, an empty line in the edge_list.csv file is rendered as a self-loop for the first node.


Lastly, a Thank You Note!

I have been stuck with plotting networks in tikz for years, and have found this repo in particular helpful: it helps with integrating the plotting task with the modeling practices ==> the edge-list and node-list are now ready for use at more than one occasions! This saves a lot of effort in converting the format, and helps a lot for documentation purpose!

Importing figures as layer pictures

Could you please provide an example how to import figures as background images in the layers of a multilayer network, as used in the front page example network? Also, how do you create the labels next to the layers?
If you just give the source code how to create the front image, that would be very helpful to see the necessary commands.

Add Vertex boundary color (or, how to encode multiple style fields in CSV)

Hello! I am trying to set the outer color and fill color of a vertex separately - for example, setting the outline to light grey and the fill color to light blue to de-emphasize some vertices in an illustration.

The color Vertex attribute controls the fill color, but not the outline color, which remains black. Instead, it looks like I need to set the tikz style, like:

\Vertex[style={color=black!20,fill=blue!20}]{A}

This works for an individual vertex, but I cannot figure out how to add the same rules to a CSV. I've tried a few variations on:

id, x, y, label, style
v0, 0.238, 3.926, v0, black!20,fill=blue!20

Presumably this doesn't work because we can't have a comma in the CSV value. Escaping the comma, either with backslashes, {black!20,fill=blue!20}, or "{black!20,fill=blue!20}", has not worked. Breaking the single style field into two style fields hasn't worked, either. I've tried using space-separated .dat files instead of CSV, but have been unable to get \Vertices to read them.

Is there a way to accomplish what I'm trying to do? Or, ideally, would it be possible to add some kind of outlineColor attribute to tikz-network vertices to make this process much simpler? Thanks!

Error at compiling example from the Manual tikz-network

As per example on page 26 of the manual (https://github.com/hackl/tikz-network/) when doing latexmk -pdflua -pvc or latexmk -pdfxe -pvc I get the following error below. Note: already tried #5:

! Package xkeyval Error: `R' undefined in families `vertex'.

See the xkeyval package documentation for explanation.
Type  H <return>  for immediate help.
 ...                                              

l.6 \Vertices[RGB]{data/vertices_RGB.csv}

?

MWE:


\documentclass{article}
\usepackage{tikz-network}
\thispagestyle{empty}
\begin{document}
\begin{tikzpicture}
\Vertices[RGB]{data/vertices_RGB.csv}
\end{tikzpicture}
\end{document}

Conflict with package tikz-qtree about \Edge

Here is my code:

\usepackage{tikz-network}
\usepackage{tikz-qtree}

\begin{document}
\begin{tikzpicture}[sibling distance=0.6em]
    \Tree [.A [.B ] \edge[draw=none]; {} ]
    \Vertex[label=A]{A}
    \Vertex[label=B,x=1]{B}
    \Edge[label=6](A)(B)
\end{tikzpicture}
\end{document}

A error occured when I compiled it with xelatex.
Here is a part of output:

e:/.../mwe.tex:10: Use of \@edge doesn't match its definition.
\\Edge [#1]->\@edge [
                     #1]
l.10     \Edge[label=6]
                       (A)(B)
? 

The color when use the option ⟨opacity⟩

The color is not satisfactory when use the option ⟨opacity⟩. I notice that when I use \Vertex[label = x_1, Math, color = blue, opacity = 0.2]{x_1}, for instance, blue turns into purple. Just as the illustration below.

image

Auto detect RGB values from csv file

Currently, the RGB option has to be enabled in the latex document by using:

\Edges[RGB]{edges.csv}

The library should be able to detect the RGB values directly from the csv file.

Global options for tikzpicture

Not a bug but rather the wish for an additional feature.

I'd like to be able to insert arbitrary text between \begin{tikzpicture} and the first \Vertex-Statement. In particular this would allow me to insert lines such as the following:
\SetDistanceScale{1.2} \SetVertexStyle[FillColor=blue,FillOpacity=0.7,LineOpacity=0.7,MinSize=0.5cm]
as well as comments for myself.

Especially when using a lot of options, the resulting .tex-file becomes much more readable by not repeating global options within every vertex or edge statement. It would also allow to use features for nodes, which are not implemented in tikz-network such as LineOpacity for the borders of nodes.

Allow unlimited spacing between vertices when bounded by edges

This is not really a bug, but a request (and suggestion).
I have been using


\SetCoordinates[options]
\begin {scope} [multilayer = 3d]
...
\end{scope}

or

...
\Plane[options, style={rotate=angle}]
...

To try to rotate both the layer and the plane (individually), and in the first code I can do it but in the second code just rotates the plane and not the layer.
But although I can rotate the layer (individually) and plane (individually) using scope, when I try to change the distance between two edge bound vertices I get the message "Dimension too large".

shape C not found in the edges.csv

As pointed out at https://tex.stackexchange.com/questions/502182/shape-c-not-found-in-the-files-csv-tikz-network-package I ask your opinion @hackl and the suggestion for use of standalone in the manual examples in order to circumvent potential problems by users by compiling the same examples individually on their own. Thank you for writing this package which helps a lot to deal with and visualize the dynamics behind processes, especially with integrated information theory.

Argument Spacing When Using lw Option for \ Edge Causes Compile Error in Latexmk with Tikz-Network Package

Writing the code with no spaces between the arguments of "\Edge[h local options i](Vertex i)(Vertex j)" normally handles processing:

\documentclass{article}
\usepackage {tikz-network}
\thispagestyle {empty}
\begin {document}
\begin {tikzpicture}
\Vertex{A} \Vertex [x = 2] {B} \Vertex [x = 2, y = -1] {C}
\Edge [lw = 3pt] (A) (B)
\Edge [lw = 5pt] (A) (C)
\end {tikzpicture}
\end {document}


But if there is spacing (whatever that is) between the arguments of "\Edge[h local options i](Vertex i)" as shown below:

\documentclass{article}
\usepackage{tikz-network}
\thispagestyle {empty}
\begin {document}
\begin {tikzpicture}
\Vertex {A} \Vertex [x = 2] {B} \Vertex [x = 2, y = -1] {C}
% Case 1: space between <[lw = 3pt]> and <(A)(B)>
\Edge [lw = 3pt] (A)(B)
% Case 2 (below): or even if there is a space between <(A)> and <(C)> as below
\Edge[lw = 5pt](A) (C)
\end {tikzpicture}
\end {document}


I get the following errors in their order as is the spacing in the code above:

Case 1 - Space between <[lw = 3pt]> and <(A)(B)> returns the following error:

Runaway argument?
(A)(B) \ end {tikzpicture} \ end {document}
! File ended while scanning use of \ @edge.
<inserted text>
\pair
<*> 17.tex
       
?

Case 2 - Space between <[lw = 5pt] (A)> and <(C)> returns the following error:

! Undefined control sequence.
\ pgfonlayer @ assert @ is @ active ... fonlayer @ isactive
                                                  {0} \ expandfter \ pgf @ asser ...

1.8 \ Edge [lw = 5pt] (A) (C)
                     
?

Note 1: Putting spacing between <\Edge> and <[h local options i](Vertex i)(Vertex j)> returns no error.
Note 2: Examples taken from Section 2.2, page 15 of https://ctan.org/pkg/tikz-network.
Note 3: Command latexmk and Zathura viewer were used.
Apparently everything is related to using the lw (\Edge line width size) option.
Note 4: As advised at https://tex.stackexchange.com/a/501300/178949 by user TeXnician there is apparently a guideline in the code script preventing the inclusion of spacing.

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.