0

I tried drawing subplot through relplot method of seaborn. Now the question is, due to the original dataset is varying, sometimes I don't know how much final subplots will be.

I set col_wrap to limit it, but sometimes the results looks not so good. For example, I set col_wrap = 3, while there are 5 subplots as below:

enter image description here

As the figure shows, the x_axis only occurs in the C D E, which seems strange. I want x axis label is shown in all subplots(from A to E).

Now I already know that facet_kws={'sharex': 'col'} allows plots to have independent axis scales(according to set axis limits on individual facets of seaborn facetgrid).

But I want set labels for x axis of all subplots.I haven't found any solution for it.

Any keyword like set_xlabels in object FacetGrid seems to be useless, because official document announces they only control "on the bottom row of the grid".

FacetGrid.set_xlabels(label=None, clear_inner=True, **kwargs)
Label the x axis on the bottom row of the grid.

The following are my example data and my code:

  city  date  value
0    A     1      9
1    B     1     20
2    C     1      4
3    D     1     33
4    E     1      2
5    A     2     22
6    B     2     32
7    C     2     27
8    D     2     32
9    E     2     18
import seaborn as sns
import matplotlib.pyplot as plt
import pandas as pd
df = pd.read_excel("data/example_data.xlsx")
# print(df)
g = sns.relplot(data=df, x="date", y="value", kind="line", col="city", col_wrap=3,
                    errorbar=None, facet_kws={'sharex': 'col'})
(g.set_axis_labels("x_axis", "y_axis", )
 .set_titles("{col_name}")
 .tight_layout()
 .add_legend()
)

plt.subplots_adjust(top=0.94, wspace=None, hspace=0.4)
plt.show()

Thanks in advance.

yy w
  • 65
  • 7

1 Answers1

0

In order to reduce superfluous information, Seaborn makes these inner labels invisible. You can make them visible again:

import matplotlib.pyplot as plt
import seaborn as sns
import pandas as pd
import numpy as np

df = pd.DataFrame({'date': np.repeat([1, 2], 5),
                   'value': np.random.randint(1, 20, 10),
                   'city': np.tile([*'abcde'], 2)})
# print(df)
g = sns.relplot(data=df, x="date", y="value", kind="line", col="city", col_wrap=3,
                errorbar=None, facet_kws={'sharex': 'col'})
g.set_titles("{col_name}")
g.add_legend()

for ax in g.axes.flat:
     ax.set_xlabel('x axis', visible=True)
     ax.set_ylabel('y axis', visible=True)

plt.subplots_adjust(top=0.94, wspace=None, hspace=0.4)
plt.show()

seaborn facetgrid, adding inner xlabel and ylabel

JohanC
  • 71,591
  • 8
  • 33
  • 66