endangeredoxen / fivecentplots

A Python plotting analgesic
https://endangeredoxen.github.io/fivecentplots
11 stars 6 forks source link

boxplots: cannot specify col without also specifying groups #67

Closed selting closed 3 days ago

selting commented 8 months ago

Hi, first of all thank you for this great library!

The following MWE tries to create a boxplot with different facet columns. However, it throws an error. It does work if the groups kwarg is included. (The same holds for using row).

MWE:

import fivecentplots as fcp
import matplotlib.pyplot as plt
import pandas as pd

df = pd.read_csv(
    'https://gist.githubusercontent.com/seankross/a412dfbd88b3db70b74b/raw/5f23f993cd87c283ce766e7ac6b329ee7cc2e1d1/mtcars.csv')

fcp.boxplot(
    df,
    y='mpg',
    # groups=['gear'],
    col='am',
)
# stop from auto-closing the plot
plt.show()

Stack Trace:

Warning: divide by zero encountered in scalar floor_divide
Warning: invalid value encountered in scalar multiply
Warning: divide by zero encountered in scalar floor_divide
Warning: invalid value encountered in scalar multiply
Traceback (most recent call last):

  File "C:\ProgramData\Miniconda3\envs\CR_AHD_py310\lib\site-packages\fivecentplots\fcp.py", line 249, in boxplot
    return plotter(data.Box, **utl.dfkwarg(df, kwargs))
  File "C:\ProgramData\Miniconda3\envs\CR_AHD_py310\lib\site-packages\fivecentplots\fcp.py", line 1567, in plotter
    dd = globals()['plot_{}'.format(dd.name)](dd, layout, ir, ic, df_rc, kwargs)
  File "C:\ProgramData\Miniconda3\envs\CR_AHD_py310\lib\site-packages\fivecentplots\fcp.py", line 1034, in plot_box
    layout.plot_box(ir, ic, data, **kwargs)
  File "C:\ProgramData\Miniconda3\envs\CR_AHD_py310\lib\site-packages\fivecentplots\engines\mpl.py", line 2048, in plot_box
    ll = ['' for f in self.axes.obj[ir, ic].get_xticklabels()]
  File "C:\ProgramData\Miniconda3\envs\CR_AHD_py310\lib\site-packages\matplotlib\axes\_base.py", line 74, in wrapper
    return get_method(self)(*args, **kwargs)
  File "C:\ProgramData\Miniconda3\envs\CR_AHD_py310\lib\site-packages\matplotlib\axis.py", line 1451, in get_ticklabels
    return self.get_majorticklabels()
  File "C:\ProgramData\Miniconda3\envs\CR_AHD_py310\lib\site-packages\matplotlib\axis.py", line 1408, in get_majorticklabels
    self._update_ticks()
  File "C:\ProgramData\Miniconda3\envs\CR_AHD_py310\lib\site-packages\matplotlib\axis.py", line 1265, in _update_ticks
    minor_locs = self.get_minorticklocs()
  File "C:\ProgramData\Miniconda3\envs\CR_AHD_py310\lib\site-packages\matplotlib\axis.py", line 1484, in get_minorticklocs
    minor_locs = np.asarray(self.minor.locator())
  File "C:\ProgramData\Miniconda3\envs\CR_AHD_py310\lib\site-packages\matplotlib\ticker.py", line 2955, in __call__
    locs = np.arange(tmin, tmax, minorstep) + t0
ValueError: arange: cannot compute length
endangeredoxen commented 7 months ago

Thanks!

Good find; I don't believe I ever tested row/col grouping with no "groups". Your PR looks good and I'll test it and integrate. Thanks for contributing!

endangeredoxen commented 3 days ago

All combinations of your example are now working in the v0.6.0 branch:

df = pd.read_csv('https://gist.githubusercontent.com/seankross/a412dfbd88b3db70b74b/raw/5f23f993cd87c283ce766e7ac6b329ee7cc2e1d1/mtcars.csv')
fcp.boxplot(df, y='mpg')

image

fcp.boxplot(df, y='mpg', groups=['gear'])

image

fcp.boxplot(df, y='mpg', col='am', groups=['gear'])

image

fcp.boxplot(df, y='mpg', col='am')

image

fcp.boxplot(df, y='mpg', col='am', groups=None)

image