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

Issue with newer version of matplotlib #22

Open
JenniferShelton opened this issue Mar 14, 2018 · 8 comments
Open

Issue with newer version of matplotlib #22

JenniferShelton opened this issue Mar 14, 2018 · 8 comments

Comments

@JenniferShelton
Copy link

Thanks for the package it is very useful. I do get an index error unless I use matplotlib 1.4.3. The new version (2.2.0) fails with the following trace back

Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/nethome/jshelton/miniconda2/envs/pipenv3/lib/python3.6/site-packages/pyupset/visualisation.py", line 63, in plot
    upset = UpSetPlot(len(ordered_dfs), len(ordered_in_sets), additional_plots, query)
  File "/nethome/jshelton/miniconda2/envs/pipenv3/lib/python3.6/site-packages/pyupset/visualisation.py", line 127, in __init__
    self.ax_setsize, self.ax_tablenames, self.additional_plots_axes = self._prepare_figure(additional_plots)
  File "/nethome/jshelton/miniconda2/envs/pipenv3/lib/python3.6/site-packages/pyupset/visualisation.py", line 180, in _prepare_figure
    ax_setsize = plt.subplot(gs_top[-1:-setsize_h, 0:setsize_w])
  File "/nethome/jshelton/miniconda2/envs/pipenv3/lib/python3.6/site-packages/matplotlib/gridspec.py", line 161, in __getitem__
    [_normalize(k1, nrows), _normalize(k2, ncols)], (nrows, ncols))
  File "/nethome/jshelton/miniconda2/envs/pipenv3/lib/python3.6/site-packages/matplotlib/gridspec.py", line 153, in _normalize
    raise IndexError("invalid index")
IndexError: invalid index

You can recreate the error running your test dataset with updated matplotlib.

Best,
Jennifer

@sert23
Copy link

sert23 commented May 5, 2018

Same problem here, did you manage to fix this?

@ColeBoudreau
Copy link

ColeBoudreau commented May 30, 2018

I'm having the same issue, is there still no fix?

(edit)
Okay so this definitely isn't the best fix, but I noticed in _prepare_figure, line 179-182, the gs_top was being indexed like gs_top[-1:-setsize_h, ...] but setsize_h is always greater than -1, causing that to return a null list. I think this is where the Index Error stems from. I simple changed the order (gs_top[-setsize_h:-1, ...]) so it could at least get past those lines correctly, and this lets me at least display the figure. This may ruin some functionality for additional plots, but those were unneeded for my purpose anyway. Hope this helps!

@mproffitt
Copy link

This isn't strictly a py-upset issue although it will most likely need to be resolved here.

In matplotlib > 2.2.0, the getitem method was re-written to include a new "normalize" definition.
This normalize validates slices to ensure that the end key is greater than the start key, effectively blocking negative indexing.

I'm not sure this is a problem in matplotlib rather than desired behaviour but there are two ways of fixing it:

  1. patch matplotlib.gridspec:138-154
    def __getitem__(self, key):
        """Create and return a SuplotSpec instance.
        """
        nrows, ncols = self.get_geometry()

        def _normalize(key, size):  # Includes last index.
            if isinstance(key, slice):
                start, stop, _ = key.indices(size)
                if stop > start:
                    return start, stop - 1
+              return stop - 1, start
            else:
                if key < 0:
                    key += size
                if 0 <= key < size:
                    return key, key
            raise IndexError("invalid index")
  1. More involved but friendlier and more compatible, patch py-upset to no longer use negative indexing on the grid.

DavideFauri added a commit to DavideFauri/py-upset that referenced this issue Jun 4, 2018
DavideFauri added a commit to DavideFauri/py-upset that referenced this issue Jun 4, 2018
@waqarali141
Copy link

I'm Still having the same issue !

Any Fix around >?

@Gustawsson-J
Copy link

Gustawsson-J commented Sep 17, 2018

Also still having the same issue despite mproffitt's suggestion. The error's just moved to line 154..
Due to other dependencies, I have no means to downgrade matplotlib to 1.4.3 or alike.

Any ideas?

@burkesquires
Copy link

Same here...invalid index when I try to demo the code


IndexError Traceback (most recent call last)
in
5 data_dict = load(f)
6
----> 7 pyu.plot(data_dict)

~/anaconda3/lib/python3.6/site-packages/pyupset/visualisation.py in plot(data_dict, unique_keys, sort_by, inters_size_bounds, inters_degree_bounds, additional_plots, query)
61 ordered_dfs, ordered_df_names = plot_data.ordered_dfs, plot_data.ordered_df_names
62
---> 63 upset = UpSetPlot(len(ordered_dfs), len(ordered_in_sets), additional_plots, query)
64 fig_dict = upset.main_plot(ordered_dfs, ordered_df_names, ordered_in_sets, ordered_out_sets,
65 ordered_inters_sizes)

~/anaconda3/lib/python3.6/site-packages/pyupset/visualisation.py in init(self, rows, cols, additional_plots, query)
125 self.x_values, self.y_values = self._create_coordinates(rows, cols)
126 self.fig, self.ax_intbars, self.ax_intmatrix,
--> 127 self.ax_setsize, self.ax_tablenames, self.additional_plots_axes = self._prepare_figure(additional_plots)
128
129 self.standard_graph_settings = {

~/anaconda3/lib/python3.6/site-packages/pyupset/visualisation.py in _prepare_figure(self, additional_plots)
178 intmatrix_w, intmatrix_h = tablesize_w + self.cols, self.rows
179 intbars_w, intbars_h = tablesize_w + self.cols, self.rows * 4
--> 180 ax_setsize = plt.subplot(gs_top[-1:-setsize_h, 0:setsize_w])
181 ax_tablenames = plt.subplot(gs_top[-1:-tablesize_h, setsize_w:tablesize_w])
182 ax_intmatrix = plt.subplot(gs_top[-1:-intmatrix_h, tablesize_w:intmatrix_w])

~/anaconda3/lib/python3.6/site-packages/matplotlib/gridspec.py in getitem(self, key)
159 raise ValueError("unrecognized subplot spec")
160 num1, num2 = np.ravel_multi_index(
--> 161 [_normalize(k1, nrows), _normalize(k2, ncols)], (nrows, ncols))
162 else: # Single key
163 num1, num2 = _normalize(key, nrows * ncols)

~/anaconda3/lib/python3.6/site-packages/matplotlib/gridspec.py in _normalize(key, size)
151 if 0 <= key < size:
152 return key, key
--> 153 raise IndexError("invalid index")
154
155 if isinstance(key, tuple):

IndexError: invalid index

pedromiravaz added a commit to pedromiravaz/py-upset that referenced this issue Dec 11, 2018
@pedromiravaz
Copy link

pedromiravaz commented Dec 11, 2018

Fork using Cole Boudreau's solution above:

pedromiravaz/py-upset

(my first try at forking and changing someone else's code, so if I did something reproachable please let me know!)

JasonBenn pushed a commit to JasonBenn/py-upset that referenced this issue May 10, 2019
@keoughkath
Copy link

Due to this issue I've switched to this version of UpSet implementation: https://github.com/jnothman/UpSetPlot and it seems to be working fine.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

9 participants