построить данные с разным масштабом на одной оси Y на вспомогательных участках - PullRequest
0 голосов
/ 27 октября 2019

У меня есть фрейм данных с данными переменного масштаба, я пытаюсь получить график с субплотами. как-то так. enter image description here

raw_data = {'strike_date': ['2019-10-31', '2019-11-31','2019-12-31','2020-01-31', '2020-02-31'], 
            'strike': [100.00, 113.00, 125.00, 126.00, 135.00], 
            'lastPrice': [42, 32, 36, 18, 23], 
            'volume': [4, 24, 31, 2, 3],
            'openInterest': [166, 0, 0, 62, 12]}
    ploty_df = pd.DataFrame(raw_data, columns = ['strike_date', 'strike', 'lastPrice', 'volume', 'openInterest'])
    ploty_df





strike_date strike  lastPrice   volume  openInterest
0   2019-10-31  100.0   42  4   166
1   2019-11-31  113.0   32  24  0
2   2019-12-31  125.0   36  31  0
3   2020-01-31  126.0   18  2   62
4   2020-02-31  135.0   23  3   12

это то, что я пробовал до сих пор с твинксом, если вы заметили, что выход - это плоские данные без какой-либо разницы в масштабе для удара иобъем.

    fig, ax = plt.subplots()
fig.subplots_adjust(right=0.75)

mm = ax.twinx()
yy = ax.twinx()
for col in ploty_df.columns:
        mm.plot(ploty_df.index,ploty_df[[col]],label=col)
mm.set_ylabel('volume')
yy.set_ylabel('strike')
yy.spines["right"].set_position(("axes", 1.2))
yy.set_ylim(mm.get_ylim()[0]*12, mm.get_ylim()[1]*12)
plt.tick_params(axis='both', which='major', labelsize=16)

handles, labels = mm.get_legend_handles_labels()
mm.legend(fontsize=14, loc=6)
plt.show()

и выход

enter image description here

1 Ответ

0 голосов
/ 28 октября 2019

Основная проблема в вашем скрипте состоит в том, что вы генерируете 3 оси, но строите графики только на одной из них, вам нужно думать о каждой оси как об отдельном объекте с собственным y-масштабом, y-limit и так далее. Так, например, в вашем скрипте, когда вы вызываете fig, ax = plt.subplots(), вы генерируете первые оси, которые вы называете топором (это стандартная ось Yaxis со шкалой в левой части графика). Если вы хотите построить что-то на этих осях, вы должны назвать ax.plot(), но в вашем случае вы строите все на осях, которые вы назвали мм. Я думаю, что вы действительно должны просмотреть документацию по matplotlib, чтобы лучше понять эти концепции. Для построения графика по нескольким осям Y я бы порекомендовал вам взглянуть на этот пример .

Ниже вы можете найти базовый пример для построения ваших данных на 3 разных осях Y, выможет взять его в качестве отправной точки для построения графика, который вы ищете.

#convert the index of your dataframe to datetime
plot_df.index=pd.DatetimeIndex(plot_df.strike_date)

fig, ax = plt.subplots(figsize=(15,7))
fig.subplots_adjust(right=0.75)

l1,=ax.plot(plot_df['strike'],'r')
ax.set_ylabel('Stike')

ax2=ax.twinx()
l2,=ax2.plot(plot_df['lastPrice'],'g')
ax2.set_ylabel('lastPrice')

ax3=ax.twinx()
l3,=ax3.plot(plot_df['volume'],'b')
ax3.set_ylabel('volume')
ax3.spines["right"].set_position(("axes", 1.2))
ax3.spines["right"].set_visible(True)

ax.legend((l1,l2,l3),('Stike','lastPrice','volume'),loc='center left')

вот результат: enter image description here

пс Ваш пример данных содержит несуществующие даты (31 февраля 2020 года), поэтому вам нужно изменить их, чтобы иметь возможность преобразовать индекс в дату и время.

...