Python - Линейный график графика с датой и столбцом со значениями NaN в matplotlib - PullRequest
0 голосов
/ 04 июня 2018

Мне нужно построить некоторые данные с помощью основного графика.

       datatime             col1
29/08/2017 10:13:23.972      NaN
29/08/2017 10:13:23.972      NaN
29/08/2017 10:13:54.449      425
29/08/2017 10:14:19.800      425
29/08/2017 10:14:45.232      425
29/08/2017 10:14:48.567      NaN
29/08/2017 10:15:19.331      2
29/08/2017 10:15:38.081      380
29/08/2017 10:16:27.517      380

Теперь у меня есть некоторые проблемы.Что мне нужно, так это построить график и, если есть NaN, создать пустое пространство на графике, а не строку от предыдущего к следующему значению.Я имел обыкновение строить с помощью matplotlib, но не знаю, как интегрировать этот шаг «пропустить».И было бы хорошо, если бы можно было отображать значение в строке для каждого прыжка выше или ниже.

Что у меня есть:

def plot_1(data, par_time, par_y, par_ylabel, par_legend):
    fig = plt.figure(figsize=(5, 3))
    ax1 = fig.add_subplot(111)
    plt.gca().set_color_cycle(['red', 'blue', 'green', 'brown'])
    ax1.plot(data[par_time], data[par_y], label=par_ylabel, marker='o', linewidth=2.0)
    plt.ylabel(par_ylabel)
    handles, labels = ax1.get_legend_handles_labels()
    ax1.legend(handles, par_legend, loc='upper center', bbox_to_anchor=(1.15, 1))
    ax1.grid('on')
    for i, j in zip(data[par_time], data[par_yticks]):
        ax1.annotate(str(j), xy=(i, j))
    a = plt.savefig('/home/user/graph.png)
    return a

Здесь не так много строк, но если бы это былобыть, х был бы настолько перегружен, возможно ли создать каждую сетку, например, за 3 секунды?

Заранее благодарю за любую помощь.

1 Ответ

0 голосов
/ 04 июня 2018

IIUC, этот код может работать на вас.Я установил интервал по оси x на 30 секунд (вместо 3, которые вы просили), потому что 3-секундный интервал приводит к большому скоплению вашей оси x.В любом случае, это должно дать вам представление о том, как двигаться вперед.

Основная идея в этом коде - создать пробел, в котором у вас есть значения NaN, - создать новый столбец в ваших данных, вЧтобы сгруппировать каждый непрерывный (не NaN) блок вместе, а затем построить каждую из этих групп.

import matplotlib.pyplot as plt
import matplotlib.dates as md

# Make sure `datatime` is in datetime format
df['datatime'] = pd.to_datetime(df.datatime)

# create new group if interrupted by NaN
df['group'] = df.col1.isnull().cumsum()


fig, ax = plt.subplots()
# Groupby your new group column, and plot each group
for _, group in df.groupby('group'):
    plt.plot(group.dropna(subset=['col1']).datatime,
             group.dropna(subset=['col1']).col1,
             color='blue')

# Create your 30 second interval on the x axis, and format your dates
xlocator = md.SecondLocator(interval=30)
dateFmt = md.DateFormatter('%H:%M:%S') 

ax.xaxis.set_major_locator(xlocator)
ax.xaxis.set_major_formatter(dateFmt)
plt.xticks(rotation=90)

enter image description here

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