Matplotlib: Как заполнить таблицу ниже, имея все метки оси X и линии сетки соответственно? - PullRequest
0 голосов
/ 25 марта 2020

enter image description here

data = {'tenor': ['1w','1m','3m','6m','12m','1y','2y','3y','4y','5y','6y','7y','10y','15y','20y','25y','30y','40y','50y'],'rate_s': [0.02514, 0.026285, 0.0273, 0.0279, 0.029616, 0.026526, 0.026028, 0.024, 0.025958,0.0261375, 0.026355, 0.026, 0.026898, 0.0271745, 0.02741, 0.027, 0.0275, 0.0289,0.0284],'rate_t':[ 0.02314, 0.024285, 0.0253,0.0279, 0.028616, 0.026526,0.027028, 0.024, 0.025958,0.0271375, 0.02355, 0.026, 0.024898, 0.0271745, 0.02641,0.027, 0.0255, 0.0289,0.0284]}

Я хочу создать диаграмму синего цвета в том же формате, что и ниже. Я попробовал этот кусок кода, но результаты не являются удовлетворительными (диаграмма в белом). Это также не показывает все метки оси X. Пожалуйста, предложите.

ax = plt.gca()

df.plot(kind='line',x='tenor',y='rate_s',marker='o',color='green',ax=ax)
df.plot(kind='line',x='tenor',y='rate_y',marker='o', color='red', ax=ax)
ax.minorticks_on()
ax.grid(which='major',linestyle='-', linewidth='0.5', color='blue')
ax.grid(which='minor', linestyle=':', linewidth='0.5', color='black')
plt.show()

tplotlib

1 Ответ

0 голосов
/ 26 марта 2020

Это после обсуждений в комментариях.

Есть пара частей, полный пример внизу.

Стиль

Один из ваших вопросов был о том, как изменить стиль сюжета. Это можно сделать с помощью следующего кода:

import matplotlib.pyplot as plt 
plt.style.use('seaborn-darkgrid')

Существует много возможных стилей, и вы даже можете создать свой собственный стиль, если вы будете sh. Чтобы увидеть все возможные стили см. документация . Чтобы вывести список всех стилей, используйте plt.style.available

Пользовательский тикер

Для пользовательских тикеров: вы можете использовать FixedLocator или, если вы знаете, что это журнал или symlog, то matplotlib имеет встроенный в локаторе. См. the matplotlib do c для шкал

. Вы можете использовать FixedLocator для установки оси, которая должна быть разделена. т.е. следующий код даст вам то, что вы хотите.

import numpy as np
import matplotlib.pyplot as plt
import matplotlib.ticker as ticker

X = np.arange(0, 2000)
Y = np.arange(0, 2000)

def convert(date): 
    if 'w' in date: 
        return 7*int(date[:-1])
    if 'm' in date: 
        return 30*int(date[:-1]) 
    if 'y' in date: 
        return 30*int(date[:-1]) + 360   
ticks = [convertdate(d) for d in tenor]
plt.style.use('seaborn-darkgrid') 
ax = plt.axes()
t = ticker.FixedLocator(locs=ticks)
ax.xaxis.set_ticklabels(tenor)
ax.xaxis.set_major_locator(t)
# ax.xaxis.set_minor_locator(ticker.MultipleLocator(3))

plt.plot(X, Y, c = 'k')
plt.show()

, который производит: enter image description here

Specifi c Case

Для вашего конкретного c случая вы, вероятно, захотите пользовательские тикеры должны быть на заданном интервале c (т.е. наименьшее из rate_t, наибольшее из rate_t).

Таким образом, вам нужно изменить функцию convert следующим образом:

import numpy as np
import matplotlib.pyplot as plt
import matplotlib.ticker as ticker

x = data['rate_t']
y = data['rate_s']

def get_indices(date): 
    if 'w' in date: 
        return 7*int(date[:-1])
    if 'm' in date: 
        return 30*int(date[:-1]) 
    if 'y' in date: 
        return 30*int(date[:-1]) + 360   

def convert(indices): 
    x = np.linspace(min(data['rate_t']), max(data['rate_t']), indices[-1] + 1)
    return x[indices]
indices = [get_indices(d) for d in tenor]
ticks = convert(indices)
plt.style.use('seaborn-darkgrid') 
ax = plt.axes()
t = ticker.FixedLocator(locs=ticks)
ax.xaxis.set_ticklabels(tenor)
ax.xaxis.set_major_locator(t)
# ax.xaxis.set_minor_locator(ticker.MultipleLocator(3))

plt.plot(x, y, c = 'k')
plt.show()

(при условии, что data['rate_s'] и data['rate_t'] такие, как есть и без обработки)

Что произойдет: enter image description here

Дайте мне знать, если у вас есть какие-либо вопросы.

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