ChessViz — graphs of chess games

ChessViz reads a chess game as pgn-file and generates a visual representation of the game as a chart. The chart shows how the game developed, who was in front, which moves were critical, which moves were forced and different sections (like rook ending) of the game are marked.

ChessViz is implemented in Python with the packages “python-chess” ( and “plotly” (

Image for post
Image for post
A result of ChessViz — Magnus Carlsen loses after one bad move at move 70.

Import the chess package and open a file with games from the “London Chess Classics 2017”.

Read in a game (game number 15 in this example) and print out some metadata of the event and the game.

London Chess Classic 2017 / Carlsen, Magnus - Nepomniachtchi, Ian  0-1 / 2017.12.10

Loading the open source chess engine “Stockfish” (, which we use to evaluate the board positions of the games. The connection is done via the “Universal Chess Interface” communication protocol (

A Chessboard can be represented as a string in the Forsyth–Edwards Notation (FEN) You can see an Example which represents the starting position below.

'rnbqkbnr/pppppppp/8/8/8/8/PPPPPPPP/RNBQKBNR w KQkq - 0 1'

For some counting operations on the board, we need a little helper function, which converts FEN notation to a tensor representation of the board.

With this function we can, for example, count all pieces on board.

We use this function to detect sections of the game like rook- or pawn-endings.

Now we use the chess-engine and the counting functions to analyze the game. The results are stored in the dictionary “counts”.

Print out the final position of the game.

Image for post
Image for post
Final Position of the game

Now let us construct the data to plot the graphs. Import the plotly package and prepare some lists with color and count information. “bubble” is used to set the size the markers and it is divided by 2 to scale down the size.

“best” is the difference of the best move in a position and the second best move and is, therefore, a measure how critical a position is. We use it on a logarithmic scale.

We prepare lists of shapes to show the different phases of the game and if the king is in check.

And prepare some annotations for the plot.

Generate the plot

A scatterplot for the scores with the size of the markers representing the number of possible moves in a position is plotted. The color of the markers shows how critical a position was.

Image for post
Image for post
Final plot of a game

The plot shows that after a good start for white, black got almost a winning position, but with the beginning of the rook-ending the advantage vanished, and the game ended in a draw.

In the same way, as in this article, you can derive additional features of a chess game by using the engine and counts of different sorts of pieces.


The first game of the 2018 world championship.

Image for post
Image for post

Carlson had a winning position in the middle game but could not convert it to a win.

University of Applied Sciences Upper Austria / School of Informatics, Communications and Media

Get the Medium app

A button that says 'Download on the App Store', and if clicked it will lead you to the iOS App store
A button that says 'Get it on, Google Play', and if clicked it will lead you to the Google Play store