Как заставить панд и родную матплотлиб делить ось - PullRequest
0 голосов
/ 13 февраля 2019

Я, ребята,

Рассмотрим следующий пример

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

fig, (ax1,ax2) = plt.subplots(2,1)
dates = pd.date_range("2018-01-01","2019-01-01",freq = "1d")
x = pd.DataFrame(index = dates, data = np.linspace(0,1,len(dates)) )
x.plot(ax=ax1)
y = np.random.random([len(dates),100]) * x.values 
ax2.pcolormesh(range(len(x)), np.linspace(-1,1,100), y.T)
plt.show()

Plot

В этот момент я бы хотел обе оси(ax1, ax2), чтобы разделить ось x, т.е. отображать правильные даты панд на второй оси.sharex=True не похоже на работу.Как я могу этого достичь?Я пробовал разные возможности, которые не сработали.

Редактировать: Поскольку форматирование даты панд превосходит собственное форматирование matplotlib, пожалуйста, предоставьте мне решение, в котором используется форматирование даты панд (например, масштабирование синтерактивное окружение работает намного лучше с форматированием даты панд).Спасибо!

Ответы [ 2 ]

0 голосов
/ 13 февраля 2019

То, что работает нормально, - это сначала построить ту же линию на осях, на которых должно размещаться изображение, затем построить изображение, а затем снова удалить линию.Что он делает, так это то, что он говорит пандам применять свои локаторы и форматеры к этим осям;они останутся после удаления линии.

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

fig, (ax1,ax2) = plt.subplots(2,1, sharex=True)
dates = pd.date_range("2018-01-01","2019-01-01",freq = "1d")
x = pd.DataFrame(index = dates, data = np.linspace(0,1,len(dates)) )
x.plot(ax=ax1)
y = np.random.random([len(dates),100]) * x.values 

x.plot(ax=ax2, legend=False)
ax2.pcolormesh(dates, np.linspace(-1,1,100), y.T)
ax2.lines[0].remove()

plt.show()

enter image description here

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

0 голосов
/ 13 февраля 2019

Один из способов сделать это - выполнить всю графику с помощью matplotlib. Таким образом, нет проблем с использованием разных форматов времени:

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

fig, (ax1,ax2) = plt.subplots(2,1, sharex='col')
dates = pd.date_range("2018-01-01","2019-01-01",freq = "1d")
x = pd.DataFrame(index = dates, data = np.linspace(0,1,len(dates)) )

#x.plot(ax=ax1)
ax1.plot(x.index, x.values)


y = np.random.random([len(dates),100]) * x.values
ax2.pcolormesh(x.index, np.linspace(-1,1,100), y.T)

fig.tight_layout()
plt.show()

Это дает следующий график:

result of the above code

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...