Как подобрать xticks с нанесенным временным рядом - PullRequest
0 голосов
/ 30 октября 2018

У меня есть несколько графиков данных в зависимости от времени следующим образом:

enter image description here

Например, на этот раз серия начинается с 2003.01 и заканчивается до 2007.01. Я не знаю, почему Matplotlib решил поместить метки в случайное место, которое не очень удобно для чтения временной серии. Я хочу, чтобы в начале каждого временного ряда был символ, а затем еще раз в начале каждого года.

Я не могу использовать трюк «xlim», потому что у меня около 1000 разных сюжетов.

Вот код, который я сейчас использую

matplotlib.rcParams['text.latex.preamble']=[r"\usepackage{amsmath}"]
plt.style.use('fivethirtyeight')

def to_inch(cm):
    return cm/2.54 

rc('figure', **{
   "facecolor": "white",
   "figsize": (to_inch(11.7), to_inch(8.27),)
})

rc('text', usetex=False)
font = {
    'family': 'serif', 
    'serif': ['Computer Modern'],
    'size': 8
}
rc('font', **font)

labelsize = 6
linewidth = 0.5
axes = {
    'labelsize': labelsize,
    "edgecolor": '#cbcbcb', 
    "linewidth": linewidth,
    "facecolor": "white"
}
rc("grid", **{"linewidth": linewidth}) 
rc('axes', **axes)

rc('legend', **{'fontsize': 5})

rc('xtick', **{"labelsize": labelsize})
rc('ytick', **{"labelsize": labelsize})

nc = Dataset("o_gg.nc", 'r+')
#Get time
time = num2date(nc.variables['time'[:],getattr(nc.variables['time'],'units'))
time_ctr_ch = np.array([ xx-dt.timedelta(hours=12,minutes=15) for xx in time])
ctr_chtessel_soil = nc.variables['SoilMoist'][:,:,0,0]
plt.plot(time_ctr_ch, ctr_chtessel_soil, c='lightsteelblue', linewidth=0.5

Ответы [ 2 ]

0 голосов
/ 31 октября 2018

Вы можете использовать matplotlib.dates форматеры и локаторы.

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
from matplotlib.dates import MonthLocator, DateFormatter

y = np.random.rand(72)
x = pd.date_range('2011-03-01', periods= 72, freq= 'd')

fig, ax = plt.subplots()
ax.plot(x,y)

ax.xaxis.set_major_locator(MonthLocator())
ax.xaxis.set_major_formatter(DateFormatter("%Y-%m-%d"))

plt.show()

enter image description here

0 голосов
/ 30 октября 2018

что-то вроде этого будет работать для того, что вы просите. Измените на Годы в соответствии с вашим кодом

import matplotlib.pyplot as plt
%matplotlib inline
y = np.random.rand(72)
x = pd.date_range('2011-03-01', periods= 72, freq= 'd')


def get_strings(x):
    lst_strngs = []
    lst_strngs.append(str(x[0].date()))
    for i in range(1,72):
        if x[i].day==1:
            lst_strngs.append(str(x[i].date()))
        else:
            lst_strngs.append("")
    return lst_strngs
ax= plt.subplot()
plt.plot(x,y)

_=plt.xticks(x,get_strings(x))

Это дало бы: enter image description here

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