3

When trying to create a plot with multiple figures, I get this error

AttributeError: 'numpy.ndarray' object has no attribute 'xaxis'

My code is:

plt.figure()
n_cols = 6
n_rows = int(len(df.foo.unique()) / n_cols) # 4
fn, axis = plt.subplots(nrows=n_rows, ncols=n_cols, figsize=(30, 25))
for i in range(len(df.foo.unique())):
    sb.scatterplot(x='var1', y='var2', hue='foo', data=df[df.foo == i], ax=axis[i])

And foo is a variable from value 0 to 23, so it has length = 24. But it works when I hyperparametrize nrows and ncols ONLY assigning the following values. By doing the following, I get success:

plt.figure()
fn, axis = plt.subplots(nrows=1, ncols=12, figsize=(30, 25))
for i in range(len(df.foo.unique())):
    sb.scatterplot(x='var1', y='var2', hue='foo', data=df[df.foo == i], ax=axis[i])

Why is this happening?

A deeper view of the error:

File c:\Users\user\anaconda3\envs\ml\lib\site-packages\seaborn\_decorators.py:46, in _deprecate_positional_args.<locals>.inner_f(*args, **kwargs)
     36     warnings.warn(
     37         "Pass the following variable{} as {}keyword arg{}: {}. "
     38         "From version 0.12, the only valid positional argument "
   (...)
     43         FutureWarning
     44     )
     45 kwargs.update({k: arg for k, arg in zip(sig.parameters, args)})
---> 46 return f(**kwargs)

File c:\Users\user\anaconda3\envs\ml\lib\site-packages\seaborn\relational.py:825, in scatterplot(x, y, hue, style, size, data, palette, hue_order, hue_norm, sizes, size_order, size_norm, markers, style_order, x_bins, y_bins, units, estimator, ci, n_boot, alpha, x_jitter, y_jitter, legend, ax, **kwargs)
    822 if not p.has_xy_data:
    823     return ax
--> 825 p._attach(ax)
    827 p.plot(ax, kwargs)
    829 return ax

File c:\Users\user\anaconda3\envs\ml\lib\site-packages\seaborn\_core.py:1134, in VectorPlotter._attach(self, obj, allowed_types, log_scale)
...
-> 1134     axis = getattr(ax, f"{var}axis")
   1135     seed_data = self.plot_data[var]
   1136     if var_type == "categorical":

AttributeError: 'numpy.ndarray' object has no attribute 'xaxis'
1
  • 2
    First, you should remove plt.figure() as it creates an empty figure which is not used because plt.subplots(...) creates a new figure (filled with subplots). Further, plt.subplots() returns a figure and some axs, often called fig, axs = plt.subplots(....). By default, if there are multiple rows and multiple columns, axs will be a 2D array. It will be a 1D array when either one is 1. It will be a single ax when both are 1. You can use axs = np.ravel(axs) to always convert it to a 1D array. Commented Jun 22, 2022 at 19:05

0

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.