Преобразование нескольких функций одного сюжета matplotlib в подзаговоры - PullRequest
1 голос
/ 19 марта 2019

Следующий фрагмент кода позволяет мне с удобством построить фрейм данных x-axis-datetime:

import pandas as pd
import matplotlib

matplotlib.use('QT5Agg')
font = {'family': 'DejaVu Sans',  # 'normal',
        'size': 8}
matplotlib.rc('font', **font)
import matplotlib.pyplot as plt
import matplotlib.dates as mdates

def myMethod():
    df1 = pd.DataFrame({"a": ["1989-12-31 23:59:12", "1999-12-31 23:59:13", "2009-12-31 23:59:14"], "b": [4, 5, 6]})
    df1["date"] = pd.to_datetime(df1.a)
    df1.set_index("date", inplace=True)
    df1.drop(["a"], axis=1, inplace=True)
    return df1

df1 = myMethod()
df2 = myMethod()
df3 = myMethod()

plt.rcParams["figure.dpi"] = 200
plt.xticks(rotation=20)
plt.grid()
plt.plot(df1, "-o", markersize=2)
plt.gca().fmt_xdata = lambda x: mdates.num2date(x).strftime("%Y-%m-%d %H:%M:%S")
plt.show()
  1. Я вижу положение курсора мыши для полного значения даты и времени (yyyy-MM-dd hh:mm:ss) внизу слева. Смотрите скриншот в конце этого поста.
  2. У меня есть сетка на холсте.
  3. метки повернуты как указано.

Я бы хотел, чтобы на холсте были также df2 и df3 в качестве вспомогательных участков. Использование следующего кода делает это, но вышеупомянутые функции теряются. Как мне изменить свой код, чтобы добиться этого для всех трех подзаговоров?

ax1 = plt.subplot(3, 1, 1)
ax1.plot(df1)
ax2 = plt.subplot(3, 1, 2, sharex=ax1)
ax2.plot(df2)
ax3 = plt.subplot(3, 1, 3, sharex=ax1)
ax3.plot(df3)
plt.show()

screenshot with mouse on hover x/y details

1 Ответ

2 голосов
/ 20 марта 2019

Вы можете напрямую работать с экземплярами осей, зацикливая их и работая с ними объектно-ориентированным способом.Сначала определите объекты с 3 осями, а затем зациклите их (вместе с DataFrames) и установите свойства внутри цикла .Ниже приведен соответствующий код


fig, axes = plt.subplots(3, 1, figsize=(8, 5), sharex=True)

dfs = [df1, df2, df3]

for ax, df in zip(axes, dfs):
    ax.plot(df1, "-o", markersize=8)
    plt.setp(ax.xaxis.get_majorticklabels(), rotation=20)
    ax.grid()
    plt.gca().fmt_xdata = lambda x: mdates.num2date(x).strftime("%Y-%m-%d %H:%M:%S")
plt.tight_layout()
plt.show()

enter image description here

Делая это по-своему

fig = plt.figure(figsize=(8, 5))
ax1 = plt.subplot(3, 1, 1)
ax2 = plt.subplot(3, 1, 2, sharex=ax1)
ax3 = plt.subplot(3, 1, 3, sharex=ax1)

axes = [ax1, ax2, ax3]
dfs = [df1, df2, df3]

for ax, df in zip(axes, dfs):
    ax.plot(df1, "-o", markersize=8)
    plt.setp(ax.xaxis.get_majorticklabels(), rotation=20 )
    ax.grid()
    plt.gca().fmt_xdata = lambda x: mdates.num2date(x).strftime("%Y-%m-%d %H:%M:%S")
plt.tight_layout()
plt.show()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...