2

Sankey

I am attempting to make the Sankey function in Matplotlib to align it's labels so that the graph is more readable.

import numpy as np
import matplotlib.pyplot as plt

from matplotlib.sankey import Sankey

fig = plt.figure()
ax = fig.add_subplot(1, 1, 1, xticks=[], yticks=[], title="Example Systems")
flows = [1, -.5, -.25,-.25]
sankey = Sankey(ax=ax, unit=None)
sankey.add(flows=flows, label='one',
           labels=['1', 'horizontal allignment is currently set to center.', 'it would be nice if I could change it to justify right.', '4'],
           pathlengths = [.5,.2,.5, .75],
           orientations=[0, -1,-1, 0])

diagrams = sankey.finish()
diagrams[-1].patch.set_hatch('/')
plt.legend(loc='best')
plt.show()

In the sankey.py code I found where the horizontal alignment is set to Center ha=center

Github source

 # Add the path labels.
        texts = []
        for number, angle, label, location in zip(flows, angles, labels,
                                                  label_locations):
            if label is None or angle is None:
                label = ''
            elif self.unit is not None:
                quantity = self.format % abs(number) + self.unit
                if label != '':
                    label += "\n"
                label += quantity
            texts.append(self.ax.text(x=location[0], y=location[1],
                                      s=label,
                                      ha='center', va='center'))
        # Text objects are placed even they are empty (as long as the magnitude
        # of the corresponding flow is larger than the tolerance) in case the
        # user wants to provide labels later.

Is it possible to somehow get the text in the Sankey.py to allign differently than the defaults?

cel
  • 30,017
  • 18
  • 97
  • 117
eagletusk
  • 53
  • 4

1 Answers1

2

You can set the alignment of the texts using the object returned by finish(). Agreed, one could argue for adding the option to set the alignment in add().

fig = plt.figure()
ax = fig.add_subplot(1, 1, 1, xticks=[], yticks=[], title="Example Systems")
flows = [1, -.5, -.25,-.25]
sankey = Sankey(ax=ax, unit=None)
sankey.add(flows=flows, label='one',
           labels=['1', 'horizontal allignment is currently set to center.', 'it would be nice if I could change it to justify right.', '4'],
           pathlengths = [.5,.2,.5, .75],
           orientations=[0, -1,-1, 0])

diagrams = sankey.finish()
diagrams[-1].patch.set_hatch('/')
plt.legend(loc='best')

for d in diagrams:
    for t in d.texts:
        t.set_horizontalalignment('left')
plt.show()

enter image description here

Jordi
  • 193
  • 9