Diagram Creation Tools

There are various programs to create diagrams, and so far I haven't found the one which really satisfies me. I want to create flow charts, UML diagrams and sequence diagrams. Also I want to layout arbitrary graphs that come up with say game theory projects.

In this article I will take a look at a few graph systems that I have used over the time:

  1. GraphViz
  2. PlantUML
  3. Blockdiag
  4. Dia
  5. Draw.io
  6. Umbrello

Syntax based

The first group of programs use their own syntax.

GraphViz

GraphViz is a really mature graph layouting program. It uses a special syntax to describe the graph nodes and edges. It is rather straightforward to use, I find.

digraph {
    rankdir = RL
    overlap = false

    node [shape=component, fillcolor=gray80, style=filled]

    "testdrive" -> "configuration"
    "testdrive" -> "make_marketplace()"
    "testdrive" -> "make_datastore()"
}

One can create hierarchical diagrams (Dot) with it, these look like so:

And one can also add clusters to it, shading, and various other things. But notice how the layout is in fixed columns.

Then one can also layout graphs with a force-based layout algorithm (Neato). With this one can visualize various other graphs, which are really interesting.

There are even more layout algorithms, but so far Dot and Neato have been fine for all my use cases that can be done with GraphViz.

The problem is that I have not found a decent way to make flow charts with it. Also it always uses an automatic layout algorithm, which might not be exactly what one wants to have. Sometimes the diagrams turn out great. And in other times one just wants to manually rearrange things. But that doesn't seem possible here.

The output options are PNG, PDF and SVG, so it covers all I need.

PlantUML

The PlantUML software seems to have special use cases in mind. It can do UML diagrams, action diagrams, sequence diagrams, and a few more types. It also uses its special syntax, which feels a bit ad-hoc.

I for instance did the architecture for the autobright project with that. The diagram looks like this:

And the matching code is the following:

@startuml
allowmixing

package "core" {
    interface Sensor {
        +get_reading(): int
    }
    interface BrightnessModel {
        +map(reading: int): int
    }
    interface Display {
        +set_brightness(brightness: int)
    }
}

class ColorHug {
        get_reading(): int
}
class DDCControl {
        set_brightness(brightness: int)
        device: int
}
class ProportionalBrightnessModel {
        map(reading: int): int
}

Sensor <|-- ColorHug
BrightnessModel <|-- ProportionalBrightnessModel
Display <|-- DDCControl

class Measurements {
    add_measurement(reading: int, brightness: int): None
    get_measurements(): pd.DataFrame
    path: pathlib.Path
    df: pd.DataFrame
}

usecase Web
usecase CLI

Web --> Sensor
Web --> Display
Web --> Measurements

CLI --> Sensor
CLI --> Display
CLI --> BrightnessModel
@enduml

It has all these special arrow types as syntax there, and one can specify use cases either as (Web) or usecase Web. I find the renderings rather neat. They sure don't look modern, but they pack a lot of information.

What I really dislike is that it is not distributed with Fedora, and also that it only produces PNG pictures. On their website they have an article about PDF and how they don't support that because that would need external dependencies. But they somehow have put it into the program and you have to hunt for seven dependencies in the right versions in order to use that beta feature. Well, I'm not going to use that, then.

At least one can set the resolution to something like 300 DPI or 600 DPI, then a pixel image is still somewhat useful.

Another advantage is that it is integrated into many other tools, like Confluence. So that might be something that speaks for it.

I'm not sure yet, whether I like the flexibility of PlantUML or I am already fed up with the lack of PDF export and the weird syntax.

Blockdiag

Blockdiag has simple generators for a few different types of diagrams. It can do action, sequence, block and network diagrams. An action diagram looks like this:

The output is okay, but I find the overlapping arrows in the action diagrams displeasing.

GUI programs

There are many other programs which let you create diagrams using a GUI tool. These are great for hand-crafted diagrams, not the automatically generated graphs that use in game theory or other computer science applications.

Dia

I have used Dia to create both flow charts as well as UML diagrams. One can freely position the nodes on a canvas, and then connect them with edges. These can either be straight, or orthogonal lines, or splines. One can tweak the positions manually. The edges stay with the nodes, so one can really rearrange them.

It can export to PNG and SVG, but not to PDF. But one can convert either SVG or EPS to PDF, so that is not that big of a deal breaker.

Another caveat is that is runs well on Linux, but one will likely have a hard time to run it on either Windows or macOS.

Draw.io

The proprietary Draw.io allows the creation of diagrams in a web browser. This makes it super portable. But I find it a bit sluggish to use, as many web applications are.

And then it is hard to label the edges in a flow chart, making it really cumbersome to have outgoing edges labeled with “Yes” and “No” from decisions.

It can export the diagrams in the usual formats like PNG, PDF, SVG, and a few others. This makes it really modern and versatile.

Umbrello

Umbrello is an UML editor, which looks rather promising, in theory. But it crashes a lot on my system. They also did not have a release in over a year. I think this is just deprecated now.

Conclusion

At the moment my favorite programs are GraphViz for general graphs and Dia for flow charts and UML. At the moment I'm evaluating PlantUML for the UML diagrams, but I am not so happy with those yet. Maybe once I have a shared diagram where other people don't use Linux, PlantUML will become a better option.