Почему метод plot () объекта Axes, созданного с помощью twinx (), изменяет средство форматирования объекта xaxis? - PullRequest
0 голосов
/ 28 июня 2018

Я обнаружил странное поведение метода plot() объекта Axes, созданного методом twinx(), при построении серии Панд с индексом Datetime.

Первый случай:

import pandas as pd
import matplotlib.pyplot as plt
import matplotlib.dates as mdates

# Create a Formatter object
fmt = mdates.DateFormatter('%Y-%m')

fig = plt.figure()
ax1 = fig.add_subplot(111)

# plot
data = pd.Series([1,2,3], index=pd.to_datetime(['20180101', '20180201', '20180301']))
ax1.plot(data)

# Set the major formatter of x axis
x = ax1.xaxis
x.set_major_formatter(fmt)

plt.show()

Приведенные выше коды создают объект Axes, наносят на график серию Pandas, индексированную с помощью Datetime, а затем устанавливают основной форматер оси x. Мы можем проверить, что форматер x равен fmt на x.get_major_formatter().

Второй случай:

import pandas as pd
import matplotlib.pyplot as plt
import matplotlib.dates as mdates

# Create a Formatter object
fmt = mdates.DateFormatter('%Y-%m')

fig = plt.figure()
ax1 = fig.add_subplot(111)

# Set the major formatter of x axis
x = ax1.xaxis
x.set_major_formatter(fmt)

# plot
data = pd.Series([1,2,3], index=pd.to_datetime(['20180101', '20180201', '20180301']))
ax1.plot(data)

plt.show()

В этом случае я сначала устанавливаю основной форматер, а затем строю серию Pandas. Используя x.get_major_formatter(), мы можем проверить, что форматер оси x по-прежнему fmt. Метод plot () не меняет основной форматтер оси x.

Странная вещь случается, когда я создаю другие Оси, используя twinx().

Третий случай:

import pandas as pd
import matplotlib.pyplot as plt
import matplotlib.dates as mdates

# Create a Formatter object
fmt = mdates.DateFormatter('%Y-%m')

fig = plt.figure()
ax1 = fig.add_subplot(111)

# plot
data = pd.Series([1,2,3], index=pd.to_datetime(['20180101', '20180201', '20180301']))
ax1.plot(data)

# Set the major formatter of x axis
x = ax1.xaxis
x.set_major_formatter(fmt)

# Create another Axes
ax2 = ax1.twinx()
ax2.plot(data)

plt.show()

В этом случае я создаю еще один объект Оси, совместно использующий ось x с ax1, затем строю график серии Панд. Если мы проверим основной форматер x, используя x.get_major_formatter(), мы можем получить объект PandasAutoDateFormatter вместо fmt. Метод plot() для ax2 изменил основной форматер оси x.

Это ошибка?

...