сделать так, чтобы тиклабели были видны на графике панд, когда sharex - PullRequest
0 голосов
/ 11 октября 2018

Я хочу создать сетку из участков с общими осями 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, метки остаются скрытыми.Любые идеи, почему и как я мог решить эту проблему?

Заранее большое спасибо,
Маркус

1 Ответ

0 голосов
/ 11 октября 2018

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

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

enter image description here

...