FooBar
FooBar

Reputation: 16498

Xaxis-Tick labels have disappeared plotting with pandas onto subplot, but are still stored

Using a complicated script that nests among other pandas.DataFrame.plot() and GridSpec in a subplot setting, I have the following problem:

When I create a 2-cols 1-row gridspec, the tick lables are all correct. When I create a 1-col 2-rows gridspec however, as soon as I plot onto the first (upper row) axes using pandas.DataFrame.plot(), the x-ticklabels for the top row disappear (the ticks remain).

It is not the case that the top ticks change once I draw something on the lower ax, sharex appears to not be the issue.

However, my x-labels are still stored:

axes[0].get_xaxis().get_ticklabels()
Out[59]: 
<a list of 9 Text major ticklabel objects>

It's just that they're not displayed. I suspected a NullFormatter, but that's not the case either:

axes[0].get_xaxis().get_major_formatter()
Out[57]: 
<matplotlib.ticker.ScalarFormatter at 0x7f7414330710>

I get both ticks and labels on the top of the first axes when I do

axes[0].get_xaxis().tick_top()

However, when I then go back to tick_bottom(), I only have ticks on bottom, not the labels.

What can cause my stored labels to not to be displayed despite a "normal" formatter?

Here's a simple example:

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

from matplotlib import gridspec

df = pd.DataFrame(np.random.rand(100,2), columns=['A', 'B'])

figure = plt.figure()

GridSpec = gridspec.GridSpec(nrows=2, ncols=1)
[plt.subplot(gsSpec) for gsSpec in GridSpec]
axes = figure.axes
df.plot(secondary_y=['B'], ax=axes[0], sharex=False)

Upvotes: 4

Views: 3194

Answers (1)

Julien Marrec
Julien Marrec

Reputation: 11895

It's the secondary_y=['B'] that causes the xticks to disappear. I'm not sure why it does that.

Fortunately, you can use plt.setp(ax.get_xticklabels(), visible=True) (docs) to turn them back on manually:

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

from matplotlib import gridspec

df = pd.DataFrame(np.random.rand(100,2), columns=['A', 'B'])

figure = plt.figure()

GridSpec = gridspec.GridSpec(nrows=2, ncols=1)
axes = [plt.subplot(gsSpec) for gsSpec in GridSpec]
ax = axes[0]
df.plot(secondary_y=['B'], ax=ax, sharex=True)
plt.setp(ax.get_xticklabels(), visible=True)

Turning xticklabels back on

Upvotes: 5

Related Questions