<p dir="auto">In the objects interface, one can instantiate a faceted plot where the faceted column is wrapped. When this results in a non-rectangular grid of axes, there are no xtick labels for the bottom axes that are not on the bottom row. Example code:</p>
<div class="highlight highlight-source-python notranslate position-relative overflow-auto" dir="auto" data-snippet-clipboard-copy-content="import seaborn as sis
import seaborn.objects as so

iris = sns.load_dataset(&quot;iris&quot;)
(
  so.Plot(iris, &quot;sepal_length&quot;, 'sepal_width')
  .add(so.Dots())
  .facet(&quot;species&quot;, wrap=2)
)"><pre class="notranslate"><span class="pl-k">import</span> <span class="pl-s1">seaborn</span> <span class="pl-k">as</span> <span class="pl-s1">sis</span>
<span class="pl-k">import</span> <span class="pl-s1">seaborn</span>.<span class="pl-s1">objects</span> <span class="pl-k">as</span> <span class="pl-s1">so</span>

<span class="pl-s1">iris</span> <span class="pl-c1">=</span> <span class="pl-s1">sns</span>.<span class="pl-en">load_dataset</span>(<span class="pl-s">"iris"</span>)
(
  <span class="pl-s1">so</span>.<span class="pl-v">Plot</span>(<span class="pl-s1">iris</span>, <span class="pl-s">"sepal_length"</span>, <span class="pl-s">'sepal_width'</span>)
  .<span class="pl-en">add</span>(<span class="pl-s1">so</span>.<span class="pl-v">Dots</span>())
  .<span class="pl-en">facet</span>(<span class="pl-s">"species"</span>, <span class="pl-s1">wrap</span><span class="pl-c1">=</span><span class="pl-c1">2</span>)
)</pre></div>
<p dir="auto"><a target="_blank" rel="noopener noreferrer nofollow" href="https://user-images.githubusercontent.com/13831112/206922314-d6926cb8-74ab-4eac-bf15-9b6d59974adb.png"><img src="https://user-images.githubusercontent.com/13831112/206922314-d6926cb8-74ab-4eac-bf15-9b6d59974adb.png" alt="image" style="max-width: 100%;"></a><br>
Using <code class="notranslate">relplot</code> to generate a similar plot results with a correct plot, that has the x-tick labels for the rightmost axes.</p>
<p dir="auto">Analysis: The objects interface instantiates a plot using a rectangular <code class="notranslate">Figure.subplots</code> call (with shared axes) and then removes the axes that do not correspond to a subset of the faceted variable:<br>
</p><div class="Box Box--condensed my-2">
  <div class="Box-header f6">
    <p class="mb-0 text-bold">
      <a href="https://github.com/mwaskom/seaborn/blob/22cdfb0c93f8ec78492d87edb810f10cb7f57a31/seaborn/_core/subplots.py#L199-L208">seaborn/seaborn/_core/subplots.py</a>
    </p>
    <p class="mb-0 color-fg-muted">
        Lines 199 to 208
      in
      <a data-pjax="true" class="commit-tease-sha" href="/mwaskom/seaborn/commit/22cdfb0c93f8ec78492d87edb810f10cb7f57a31">22cdfb0</a>
    </p>
  </div>
  <div itemprop="text" class="Box-body p-0 blob-wrapper blob-wrapper-embedded data">
    <table class="highlight tab-size mb-0 js-file-line-container" data-tab-size="8" data-paste-markdown-skip="">

        <tbody><tr class="border-0">
          <td id="L199" class="blob-num border-0 px-3 py-0 color-bg-default" data-line-number="199"></td>
          <td id="LC199" class="blob-code border-0 px-3 py-0 color-bg-default blob-code-inner js-file-line"> <span class="pl-k">if</span> <span class="pl-s1">self</span>.<span class="pl-s1">wrap</span>: </td>
        </tr>

        <tr class="border-0">
          <td id="L200" class="blob-num border-0 px-3 py-0 color-bg-default" data-line-number="200"></td>
          <td id="LC200" class="blob-code border-0 px-3 py-0 color-bg-default blob-code-inner js-file-line">     <span class="pl-c"># Remove unused Axes and flatten the rest into a (2D) vector</span> </td>
        </tr>

        <tr class="border-0">
          <td id="L201" class="blob-num border-0 px-3 py-0 color-bg-default" data-line-number="201"></td>
          <td id="LC201" class="blob-code border-0 px-3 py-0 color-bg-default blob-code-inner js-file-line">     <span class="pl-s1">axs_flat</span> <span class="pl-c1">=</span> <span class="pl-s1">axs</span>.<span class="pl-en">ravel</span>({<span class="pl-s">"col"</span>: <span class="pl-s">"C"</span>, <span class="pl-s">"row"</span>: <span class="pl-s">"F"</span>}[<span class="pl-s1">self</span>.<span class="pl-s1">wrap_dim</span>]) </td>
        </tr>

        <tr class="border-0">
          <td id="L202" class="blob-num border-0 px-3 py-0 color-bg-default" data-line-number="202"></td>
          <td id="LC202" class="blob-code border-0 px-3 py-0 color-bg-default blob-code-inner js-file-line">     <span class="pl-s1">axs</span>, <span class="pl-s1">extra</span> <span class="pl-c1">=</span> <span class="pl-s1">np</span>.<span class="pl-en">split</span>(<span class="pl-s1">axs_flat</span>, [<span class="pl-s1">self</span>.<span class="pl-s1">n_subplots</span>]) </td>
        </tr>

        <tr class="border-0">
          <td id="L203" class="blob-num border-0 px-3 py-0 color-bg-default" data-line-number="203"></td>
          <td id="LC203" class="blob-code border-0 px-3 py-0 color-bg-default blob-code-inner js-file-line">     <span class="pl-k">for</span> <span class="pl-s1">ax</span> <span class="pl-c1">in</span> <span class="pl-s1">extra</span>: </td>
        </tr>

        <tr class="border-0">
          <td id="L204" class="blob-num border-0 px-3 py-0 color-bg-default" data-line-number="204"></td>
          <td id="LC204" class="blob-code border-0 px-3 py-0 color-bg-default blob-code-inner js-file-line">         <span class="pl-s1">ax</span>.<span class="pl-en">remove</span>() </td>
        </tr>

        <tr class="border-0">
          <td id="L205" class="blob-num border-0 px-3 py-0 color-bg-default" data-line-number="205"></td>
          <td id="LC205" class="blob-code border-0 px-3 py-0 color-bg-default blob-code-inner js-file-line">     <span class="pl-k">if</span> <span class="pl-s1">self</span>.<span class="pl-s1">wrap_dim</span> <span class="pl-c1">==</span> <span class="pl-s">"col"</span>: </td>
        </tr>

        <tr class="border-0">
          <td id="L206" class="blob-num border-0 px-3 py-0 color-bg-default" data-line-number="206"></td>
          <td id="LC206" class="blob-code border-0 px-3 py-0 color-bg-default blob-code-inner js-file-line">         <span class="pl-s1">axs</span> <span class="pl-c1">=</span> <span class="pl-s1">axs</span>[<span class="pl-s1">np</span>.<span class="pl-s1">newaxis</span>, :] </td>
        </tr>

        <tr class="border-0">
          <td id="L207" class="blob-num border-0 px-3 py-0 color-bg-default" data-line-number="207"></td>
          <td id="LC207" class="blob-code border-0 px-3 py-0 color-bg-default blob-code-inner js-file-line">     <span class="pl-k">else</span>: </td>
        </tr>

        <tr class="border-0">
          <td id="L208" class="blob-num border-0 px-3 py-0 color-bg-default" data-line-number="208"></td>
          <td id="LC208" class="blob-code border-0 px-3 py-0 color-bg-default blob-code-inner js-file-line">         <span class="pl-s1">axs</span> <span class="pl-c1">=</span> <span class="pl-s1">axs</span>[:, <span class="pl-s1">np</span>.<span class="pl-s1">newaxis</span>] </td>
        </tr>
    </tbody></table>
  </div>
</div>
<p></p>
<p dir="auto">Behind the scenes, <code class="notranslate">Figure.subplots</code> creates a rectangular grid and disables the inner axes' xticklabels (since all axes are shared):<br>
<a href="https://github.com/matplotlib/matplotlib/blob/cc20d3f7bbb18a21683fb499d98b0814546583c6/lib/matplotlib/axes/_base.py#L4587-L4596">https://github.com/matplotlib/matplotlib/blob/cc20d3f7bbb18a21683fb499d98b0814546583c6/lib/matplotlib/axes/_base.py#L4587-L4596</a></p>
<p dir="auto">But the deletion of the extra axes by seaborn doesn't restore the ticks and labels that <code class="notranslate">Figure.subplots</code> removed, and instead only operates on the visibility of the ticks (which are absent at this point due to the axes instantiation):<br>
</p><div class="Box Box--condensed my-2">
  <div class="Box-header f6">
    <p class="mb-0 text-bold">
      <a href="https://github.com/mwaskom/seaborn/blob/22cdfb0c93f8ec78492d87edb810f10cb7f57a31/seaborn/_core/plot.py#L1040-L1048">seaborn/seaborn/_core/plot.py</a>
    </p>
    <p class="mb-0 color-fg-muted">
        Lines 1040 to 1048
      in
      <a data-pjax="true" class="commit-tease-sha" href="/mwaskom/seaborn/commit/22cdfb0c93f8ec78492d87edb810f10cb7f57a31">22cdfb0</a>
    </p>
  </div>
  <div itemprop="text" class="Box-body p-0 blob-wrapper blob-wrapper-embedded data">
    <table class="highlight tab-size mb-0 js-file-line-container" data-tab-size="8" data-paste-markdown-skip="">

        <tbody><tr class="border-0">
          <td id="L1040" class="blob-num border-0 px-3 py-0 color-bg-default" data-line-number="1040"></td>
          <td id="LC1040" class="blob-code border-0 px-3 py-0 color-bg-default blob-code-inner js-file-line"> <span class="pl-s1">show_tick_labels</span> <span class="pl-c1">=</span> ( </td>
        </tr>

        <tr class="border-0">
          <td id="L1041" class="blob-num border-0 px-3 py-0 color-bg-default" data-line-number="1041"></td>
          <td id="LC1041" class="blob-code border-0 px-3 py-0 color-bg-default blob-code-inner js-file-line">     <span class="pl-s1">show_axis_label</span> </td>
        </tr>

        <tr class="border-0">
          <td id="L1042" class="blob-num border-0 px-3 py-0 color-bg-default" data-line-number="1042"></td>
          <td id="LC1042" class="blob-code border-0 px-3 py-0 color-bg-default blob-code-inner js-file-line">     <span class="pl-c1">or</span> <span class="pl-s1">subplot_spec</span>.<span class="pl-en">get</span>(<span class="pl-s">f"share<span class="pl-s1"><span class="pl-kos">{</span><span class="pl-s1">axis</span><span class="pl-kos">}</span></span>"</span>) <span class="pl-c1">not</span> <span class="pl-c1">in</span> ( </td>
        </tr>

        <tr class="border-0">
          <td id="L1043" class="blob-num border-0 px-3 py-0 color-bg-default" data-line-number="1043"></td>
          <td id="LC1043" class="blob-code border-0 px-3 py-0 color-bg-default blob-code-inner js-file-line">         <span class="pl-c1">True</span>, <span class="pl-s">"all"</span>, {<span class="pl-s">"x"</span>: <span class="pl-s">"col"</span>, <span class="pl-s">"y"</span>: <span class="pl-s">"row"</span>}[<span class="pl-s1">axis</span>] </td>
        </tr>

        <tr class="border-0">
          <td id="L1044" class="blob-num border-0 px-3 py-0 color-bg-default" data-line-number="1044"></td>
          <td id="LC1044" class="blob-code border-0 px-3 py-0 color-bg-default blob-code-inner js-file-line">     ) </td>
        </tr>

        <tr class="border-0">
          <td id="L1045" class="blob-num border-0 px-3 py-0 color-bg-default" data-line-number="1045"></td>
          <td id="LC1045" class="blob-code border-0 px-3 py-0 color-bg-default blob-code-inner js-file-line"> ) </td>
        </tr>

        <tr class="border-0">
          <td id="L1046" class="blob-num border-0 px-3 py-0 color-bg-default" data-line-number="1046"></td>
          <td id="LC1046" class="blob-code border-0 px-3 py-0 color-bg-default blob-code-inner js-file-line"> <span class="pl-k">for</span> <span class="pl-s1">group</span> <span class="pl-c1">in</span> (<span class="pl-s">"major"</span>, <span class="pl-s">"minor"</span>): </td>
        </tr>

        <tr class="border-0">
          <td id="L1047" class="blob-num border-0 px-3 py-0 color-bg-default" data-line-number="1047"></td>
          <td id="LC1047" class="blob-code border-0 px-3 py-0 color-bg-default blob-code-inner js-file-line">     <span class="pl-k">for</span> <span class="pl-s1">t</span> <span class="pl-c1">in</span> <span class="pl-en">getattr</span>(<span class="pl-s1">axis_obj</span>, <span class="pl-s">f"get_<span class="pl-s1"><span class="pl-kos">{</span><span class="pl-s1">group</span><span class="pl-kos">}</span></span>ticklabels"</span>)(): </td>
        </tr>

        <tr class="border-0">
          <td id="L1048" class="blob-num border-0 px-3 py-0 color-bg-default" data-line-number="1048"></td>
          <td id="LC1048" class="blob-code border-0 px-3 py-0 color-bg-default blob-code-inner js-file-line">         <span class="pl-s1">t</span>.<span class="pl-en">set_visible</span>(<span class="pl-s1">show_tick_labels</span>) </td>
        </tr>
    </tbody></table>
  </div>
</div>
<br>
Expected behavior: the ticks and their labels should be visible for non-last-row bottom axes of non-rectangular wrapped shared facets.<p></p>
<p dir="auto">When axes are shared, "internal" axes have axis and tick labels hidden. This is a good default, but might not always be what you want. It should be configurable somehow (perhaps in <code class="notranslate">Plot.layout</code>?)</p>
<p dir="auto">Additionally, the default is not idea with a "wrapped" figure where the axis is "internal" but all of the axes external to it have been removed. e.g.</p>
<div class="highlight highlight-source-python notranslate position-relative overflow-auto" dir="auto" data-snippet-clipboard-copy-content="(
    so.Plot(mpg, x=&quot;mpg&quot;)
    .pair(y=[&quot;displacement&quot;, &quot;weight&quot;, &quot;acceleration&quot;], wrap=2)
    .add(so.Dots())
)"><pre class="notranslate">(
    <span class="pl-s1">so</span>.<span class="pl-v">Plot</span>(<span class="pl-s1">mpg</span>, <span class="pl-s1">x</span><span class="pl-c1">=</span><span class="pl-s">"mpg"</span>)
    .<span class="pl-en">pair</span>(<span class="pl-s1">y</span><span class="pl-c1">=</span>[<span class="pl-s">"displacement"</span>, <span class="pl-s">"weight"</span>, <span class="pl-s">"acceleration"</span>], <span class="pl-s1">wrap</span><span class="pl-c1">=</span><span class="pl-c1">2</span>)
    .<span class="pl-en">add</span>(<span class="pl-s1">so</span>.<span class="pl-v">Dots</span>())
)</pre></div>
<p dir="auto"><a target="_blank" rel="noopener noreferrer nofollow" href="https://user-images.githubusercontent.com/315810/187003902-aa1ee825-a524-4013-898d-8923d6270b3e.png"><img src="https://user-images.githubusercontent.com/315810/187003902-aa1ee825-a524-4013-898d-8923d6270b3e.png" alt="image" style="max-width: 100%;"></a></p>
<p dir="auto">The tick labels are hidden (matplotlib has actually <em>removed</em> them due to axis sharing logic) but the axis label is visible (I actually don't understand why that is; I didn't think we had logic for that but maybe we do). Probably we want either, or both, or tick labels but not axis label, but the current situation is the worst of all possible worlds.</p>
<p dir="auto">Note that this specific situation also has some complex interactions with tight_layout / constrained_layout in terms of how much space is left between the other axes; it might be necessary to remove whichever ends up here "from the layout". Kind of a mess all around. Punting to after v0.12.0.</p>