сделать так, чтобы тиклабели были видны на графике панд, когда sharex

1

Я хочу создать сетку подзаголовков с общими осями x. Заговор должен (по некоторым причинам удобства) быть выполнен путем доступа к методу участка Pandas DataFrame. Кроме того, я хочу, чтобы метки x-tick были показаны в первой строке моей сетки. Я попытался добиться этого с помощью следующего кода:

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


x = np.linspace(0,10,100)

nrows = 4
ncols = 3
fig, axes = plt.subplots(nrows, ncols, sharex=True)

for i, ax in enumerate(axes.reshape(-1)):
    y = np.cos(x+i*np.pi)
    df = pd.DataFrame(y, index=x)
    # ax.plot(x, y)                 # shows top labels
    df.plot(ax=ax, legend=None)     # doesn't show top labels

    if i < ncols:
        # first row: plot x-ticks + x-labels
        ax.tick_params(which='both', labeltop=True, top=True)
        # also none of these approaches works:
        # plt.setp(ax.get_xticklabels(), visible=True)
        # ax.xaxis.set_tick_params(which='both', labeltop=True, top=True, colors='g')
        # for label in ax.get_xticklabels():
        #     label.set_visible(True)

plt.show()

Использование оригинальной схемы построения шрифтов из Matplotlib работает, но когда я использую метод Pandas, тикалы остаются скрытыми. Любые идеи, почему и как я мог это решить?

Заранее большое спасибо,
Markus

  • 0
    хочешь x-ticklabels только в первом ряду? Или первый и последний ряд?
  • 0
    Извините, я должен был быть более конкретным; Я хочу, чтобы они были как в последнем, так и в первом ряду. Тем не менее, метки в первом ряду должны располагаться поверх вспомогательных участков.
Показать ещё 2 комментария
Теги:
pandas
matplotlib
label
plot

1 ответ

2
Лучший ответ

Сначала вы можете создать сюжет, как вы сейчас делаете, а затем установить тики для любого подзаголовка или строки/столбца подзадачи, которую вы хотите, создав двойную ось.

В этом примере дополнительно добавляются x-ticklabels только для первой строки. Вы добавляете эти строки перед plt.show(). i<3 здесь означает только первую строку, потому что это то, как доступ к подзаголовкам осуществляется по порядку. both означают как основные, так и незначительные тики. Так как вы еще не показали минорные тики, на данный момент вы получаете только крупные тики. Вы можете настроить операторы if чтобы добавить x-ticklabels в другую строку, если хотите. Мне пришлось удалить, if я < ncols: команда из вашего кода, чтобы заставить его работать.


Полный рабочий код

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

print (sys.version)
# 3.6.5 |Anaconda, Inc.|

print (matplotlib.__version__) 
# 2.2.2

print (pd.__version__)
# 0.23.0

x = np.linspace(0,10,100)

nrows = 4
ncols = 3
fig, axes = plt.subplots(nrows, ncols, sharex=True,figsize=(12,6))

for i, ax in enumerate(axes.reshape(-1)):
    y = np.cos(x+i*np.pi)
    df = pd.DataFrame(y, index=x)
    df.plot(ax=ax, legend=None)     # doesn't show top labels

    if i < 3:
        ax1 = ax.twiny()
        ax1.set_xlim(ax.get_xlim())
        ax1.tick_params(axis='x', which='both', bottom=False, top=True, labelbottom=False) 

plt.tight_layout()
plt.show()

Изображение 174551

  • 0
    Привет и спасибо за ваш ответ. То, что вы предлагаете, действительно работает для нижних галочек / ярлыков. Но если я вместо этого хочу показать верхние метки / метки в первом ряду (в последнем ряду все равно должны отображаться нижние), это не сработает. Отображает только галочки без меток. Кроме того, что меня удивляет; Ваше решение работает, только если я вызову этот цикл вне цикла for из моего примера. Вызов оператора if i < 3: ax.tick_params(axis='x', which='both', bottom=True, top=False, labelbottom=True) непосредственно в моем цикле for также не работает.
  • 0
    Решение здесь не работает для меня независимо от того, где я поставил петлю. Я тестировал с (mpl 2.2.2, pd 0.20.1) и (mpl3.0.0, pd 0.23.4).
Показать ещё 8 комментариев

Ещё вопросы

Сообщество Overcoder
Наверх
Меню