Я обнаружил странное поведение метода 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.
Это ошибка?