Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[BUG] When you have inner and outer hierarchical labels, plotting fails if something in the cartesian product is empty #933

Open
ebridge2 opened this issue Mar 15, 2022 · 1 comment
Labels
bug Something isn't working

Comments

@ebridge2
Copy link
Collaborator

Expected Behavior

The empty communities are omitted entirely.

Actual Behavior

Error.

ValueError: The number of FixedLocator locations (4), usually from a call to set_ticks, does not match the number of ticklabels (6).

Example Code

import numpy as np
import graspologic as gp

n1 = 50; n2 = 50
Baff = [[0.5, 0.2], [0.2, 0.5]]

zvecaff = np.array(["C1" for i in range(0, n1)] + ["C2" for i in range(0, n2)])

# the probability matrix
zvecaff_ohe = np.vstack([[1, 0] for i in range(0, n1)] + [[0, 1] for i in range(0, n2)])
Paff = zvecaff_ohe @ Baff @ zvecaff_ohe.T

np1 = 15; nc = 70; np2 = 15
Bcp = [[0.2, 0.2, 0.05],
      [0.2, 0.5, 0.2],
      [0.05, 0.2, 0.2]]


zveccp = np.array(["P1" for i in range(0, np1)] +
                  ["Core" for i in range(0, nc)] +
                  ["P2" for i in range(0, np2)])

# the probability matrix
zveccp_ohe = np.vstack([[1, 0, 0] for i in range(0, np1)] + 
                       [[0, 1, 0] for i in range(0, nc)] +
                       [[0, 0, 1] for i in range(0, np2)])
Pcp = zveccp_ohe @ Bcp @ zveccp_ohe.T

Pcp_and_aff = (Paff + Pcp)/2
Acp_and_aff = gp.simulations.sample_edges(Pcp_and_aff, directed=False, loops=False)


gp.plot.heatmap(Pcp, inner_hier_labels=zveccp, outer_hier_labels=zvecaff,
                title="Core-periphery and affinity prob. P^{(cp + a)}$", vmin=0, vmax=1, cmap=cmaps["sequential"]);

Full Traceback

---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
<ipython-input-63-9fa6c510a0a5> in <module>
      1 fig, axs = plt.subplots(1,2, figsize=(10,4))
      2 
----> 3 gp.plot.heatmap(Pcp, ax=axs[0], inner_hier_labels=zveccp, outer_hier_labels=zvecaff,
      4                 title="Core-periphery and affinity prob. P^{(cp + a)}$", vmin=0, vmax=1, cmap=cmaps["sequential"]);
      5 gp.plot.heatmap(Acp, ax=axs[1], inner_hier_labels=zveccp, outer_hier_labels=zvecaff,

~/.virtualenvs/graph-book/lib/python3.8/site-packages/graspologic/plot/plot.py in heatmap(X, transform, figsize, title, context, font_scale, xticklabels, yticklabels, cmap, vmin, vmax, center, cbar, inner_hier_labels, outer_hier_labels, hier_label_fontsize, ax, title_pad, sort_nodes, **kwargs)
    353                 plot.set_yticklabels([])
    354                 plot.set_xticklabels([])
--> 355                 _plot_groups(
    356                     plot,
    357                     arr,

~/.virtualenvs/graph-book/lib/python3.8/site-packages/graspologic/plot/plot.py in _plot_groups(ax, graph, inner_labels, outer_labels, fontsize)
   1611     ax_x = divider.new_vertical(size="5%", pad=0.0, pack_start=False)
   1612     ax.figure.add_axes(ax_x)
-> 1613     _plot_brackets(
   1614         ax_x,
   1615         np.tile(inner_unique, len(outer_unique)),

~/.virtualenvs/graph-book/lib/python3.8/site-packages/graspologic/plot/plot.py in _plot_brackets(ax, group_names, tick_loc, tick_width, curve, level, axis, max_size, fontsize)
   1696     if axis == "x":
   1697         ax.set_xticks(tick_loc)
-> 1698         ax.set_xticklabels(group_names, fontsize=fontsize, verticalalignment="center")
   1699         ax.xaxis.set_label_position("top")
   1700         ax.xaxis.tick_top()

~/.virtualenvs/graph-book/lib/python3.8/site-packages/matplotlib/axes/_base.py in wrapper(self, *args, **kwargs)
     73 
     74         def wrapper(self, *args, **kwargs):
---> 75             return get_method(self)(*args, **kwargs)
     76 
     77         wrapper.__module__ = owner.__module__

~/.virtualenvs/graph-book/lib/python3.8/site-packages/matplotlib/axis.py in _set_ticklabels(self, labels, fontdict, minor, **kwargs)
   1796         if fontdict is not None:
   1797             kwargs.update(fontdict)
-> 1798         return self.set_ticklabels(labels, minor=minor, **kwargs)
   1799 
   1800     def _set_tick_locations(self, ticks, *, minor=False):

~/.virtualenvs/graph-book/lib/python3.8/site-packages/matplotlib/axis.py in set_ticklabels(self, ticklabels, minor, **kwargs)
   1718             # remove all tick labels, so only error for > 0 ticklabels
   1719             if len(locator.locs) != len(ticklabels) and len(ticklabels) != 0:
-> 1720                 raise ValueError(
   1721                     "The number of FixedLocator locations"
   1722                     f" ({len(locator.locs)}), usually from a call to"

ValueError: The number of FixedLocator locations (4), usually from a call to set_ticks, does not match the number of ticklabels (6).

Your Environment

  • Python version: 3.8
  • graspologic version: 1.0.1

Additional Details

Any other contextual information you might feel is important.

@ebridge2 ebridge2 added the bug Something isn't working label Mar 15, 2022
@ebridge2
Copy link
Collaborator Author

In the example, the cartesian product of the inner/outer hierarchies has 6 elements, but the actual network only has 4, since one of the inner communities are not possible in each of the two outer communities, yielding only 4 realized communities in the network.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
bug Something isn't working
Projects
None yet
Development

No branches or pull requests

1 participant